序列化工具protobuf初解

本文介绍了Protocol Buffers(Protobuf)的基本概念和使用步骤,包括创建.proto文件定义数据结构,使用protoc编译生成读写接口,以及如何调用接口进行序列化、反序列化和读写操作。Protobuf作为一种高效、灵活的序列化方法,适用于网络通信和数据存储,其优点在于结构数据的扩展性和兼容性。
摘要由CSDN通过智能技术生成

系列文章目录

提示:这里可以添加系列文章的所有文章的目录

前言

网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 、 XML、ProtoBuf。

protocol buffers 是一种语言无关平台无关、可扩展的二进制序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。
Protocol Buffers 扩展性、兼容性好。你可以更新数据结构,而不影响和破坏原有的旧程序

序列化:将结构数据对象转换成能够被存储传输(例如网络传输)的格式,同时应当要保证这个序列化结果在之后(可能在另一个计算环境中)能够被重建回原来的结构数据或对象。

使用 Protobuf2

第一步,创建 .proto 文件,定义数据结构

// 例1: 在 xxx.proto 文件中定义 Example1 message
syntax = "proto2";
package tutorial; // 包声明,避免命名空间的冲突

message Person {
           //person 消息
  optional string name = 1;
  optional int32 id = 2;
  optional string email = 3;

  enum PhoneType {
       //枚举类型
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
   
    optional string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phones = 4;
}

message AddressBook {
       //多个person组成的addressbook
  repeated Person people = 1;
}

我们在上例中定义了一个名为 Example1 的 消息,语法很简单,message 关键字后跟上消息名称

message xxx {
   

}

之后我们在其中定义了 message 具有的字段,形式为:

message xxx {
// 字段规则:required -> 字段只能也必须出现 1 次
// 字段规则:optional -> 字段可出现 0 次或1次
// 字段规则:repeated -> 字段可出现任意多次(包括 0)
可以认为repeated字段代表 动态数组
// 类型:int32、int64、sint32、sint64、string、32-bit …
// 字段编号:0 ~ 536870911(除去 19000 到 19999 之间的数字),
某个消息内,字段编号不能重复,1-15编码后占的空间更小
// 字段规则 类型 名称 = 字段编号;
repeated int32 repeatedInt32Val = 4;
}

required字段慎用,如果在某个时候停止写入或发送必填字段,并将该字段更改为可选字段会产生问题—旧的读者会认为没有此字段的消息不完整,并且可能会无意中拒绝或删除它们。在谷歌内部,required字段非常不受欢迎;在proto2语法中定义的大多数消息都使用可选的和重复的(Proto3根本不支持required字段。)

第二步,protoc 编译 .proto 文件生成读写接口

我们在 .proto 文件中定义了数据结构,这些数据结构是面向开发者和业务程序的,并不面向存储和传输。

当需要把这些数据进行存储或传输时,就需要将这些结构数据进行序列化、反序列化以及读写。 ProtoBuf 提供相应的接口代码。如何提供?答案就是通过 protoc 这个编译器。
可通过如下命令生成相应的接口代码:

// $SRC_DIR: .proto 所在的源目录
// --cpp_out: 生成 c++ 代码
// $DST_DIR: 生成代码的目标目录
// xxx.proto: 要针对哪个 proto 文件生成接口代码

protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto

在例1生成的文件

addressbook.pb.h 头文件
addressbook.pb.cc 代码实现

最终生成的代码将提供类似如下的接口:

1、序列化和解析接口
2、protoc API接口

  // name
  inline bool has_name() const;
  inline void clear_name(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值