字节数据 数据序列化反序列化
时间: 2021-11-19 10:46:46
参考:
序列化反序列化#
发送方把数据序列化之后发送,接收方把数据反序列化之后解析出原始数据。序列化和反序列化用于双方进行数据交互时。发送方和接收方约定序列化和反序列化的方式,确保发送方和接收方能够明白对方发送数据的含义。
常见的序列化和反序列化格式如下:
JSON
: 常用于Web服务器和客户端交互。protocol buffer
: 常用于对性能要求较高的网络通信。序列化后的数据占用空间较JSON
小。
protocol buffers#
protocol buffer 文件示例:#
示例代码参考 Ping-Pong
syntax = "proto3";
option go_package = "chainmaker.org/chainmaker-go/module/net/liquid/simple/pubsub/pb";
package pubsub;
message PubsubMsg {
//数组
repeated ApplicationMsg msg = 1;
IHaveOrWant spread_ctrl = 2;
TopicMsg topic_ctrl = 3;
PeeringMsg peering_ctrl = 4;
}
message Heartbeat {
uint64 timestamp = 1;
uint64 timestamp_res = 2;
}
message ApplicationMsg {
repeated string topics = 1;
string sender = 2;
uint64 msg_seq = 3;
bytes msg_body = 4;
bytes sender_key = 5;
bytes sender_sign = 6;
repeated string stations = 7;
}
message TopicMsg {
repeated string subscribed = 1;
repeated string unsubscribed = 2;
uint64 msg_seq = 3;
}
message PeeringMsg {
repeated string cut_off = 1;
repeated string join_up = 2;
uint64 msg_seq = 3;
}
message MsgMetadata {
string topic = 1;
string sender = 2;
uint64 msg_seq = 3;
}
message IHaveOrWant {
Phase phase =1;
repeated MsgMetadata have = 2;
repeated MsgMetadata want = 3;
// 枚举
enum Phase {
IHave = 0;
IHaveAndIWant = 1;
IWant = 2;
}
}
//生成一个服务,包含客户端代码发送请求和服务端接收请求代码(服务端接收逻辑需要自己实现)
service PubSubService {
rpc Send(PubsubMsg) returns (PubsubMsg);
}
初始化文件选项#
protoc -I=. --gogofaster_out=plugins=grpc:../protogo --gogofaster_opt=paths=source_relative ping_pong.proto
选项:
IMPORT_PATH
: 在哪里查找.proto
文件。--gogofaster_out
:输出位置。