跳转至

字节数据 数据序列化反序列化

时间: 2021-11-19 10:46:46

参考:

  1. 官网
  2. proto3
  3. 下载地址

序列化反序列化#

发送方把数据序列化之后发送,接收方把数据反序列化之后解析出原始数据。序列化和反序列化用于双方进行数据交互时。发送方和接收方约定序列化和反序列化的方式,确保发送方和接收方能够明白对方发送数据的含义。

常见的序列化和反序列化格式如下:

  1. JSON: 常用于Web服务器和客户端交互。
  2. 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:输出位置。