Protobuf数据序列化

1、Protocol Buffer介绍

Protocol Buffer( 简称 Protobuf) 是Google公司内部的混合语言数据标准,它是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或RPC 数据交换格式。

Protobuf是一个纯粹的展示层协议,可以和各种传输层协议一起使用,Protobuf的文档也非常完善。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。

Protobuf支持的数据类型相对较少,不支持常量类型。由于其设计的理念是纯粹的展现层协议,目前并没有一个专门支持Protobuf的RPC框架。

2、Protobuf使用流程

2.1 准备数据

  • 复合类型: 结构体/ 类
    • 要序列化的数据

    • 基础类型
// 要序列化的数据
struct Persion
{
    int id;
    string name;
    int age;
};

int id;

2.2、创建.proto文件,语法格式

// protobuf的版本
// proto2
syntax = "proto3";	
// 导入另外一个proto文件
import "filename.proto";
// 组织Persion结构体
// 语法格式
message 关键字(相当于被创建出的类的名字)
{
	// 成员变量
	数据类型 变量名 = 变量的编号;	// 编号从1开始, 不能重复
}
  •  repeated限定修饰符(使用数组)
  • 使用import导入另外一个proto文件
  • 使用package添加命名空间
  • 示例
// Persion.proto
syntax = "proto3";
// 导入另外一个proto文件
import "Info.proto";
// 添加命名空间
package namespace;	// Persion类属于namespace这个命名空间
enum TypeValue
{
	value1 = 0;	// protbuf中第一个枚举值必须为0
	value2 = 6;
	value3 = 9;
}

message Persion
{
    int32 id = 1;   // 编号从1开始
    repeated bytes name = 2;  //repeated修饰name可以在程序中创建多个, 在程序中作为动态数组来使用
    int32 age = 3;
    TypeValue value = 4;
    Info info = 5;	// Info对象, 导入的proto文件中的类
}
// Info.proto
syntax = "proto3";
// 添加命名空间
package namespace;	// Persion类属于namespace这个命名空间
message Info
{
    bytes address = 1; 
    int32 number = 2;   
}
  •  .proto数据类型
.proto类型C++类型备注
doubledouble64位浮点数
floatfloat32位浮点数
int32int3232位整数
int64int6464位整数
uint32uint3232位无符号整数
uint64uint6464位无符号整数
sint32sint3232位整数,处理负数效率比int32更高
sint64sint6464位整数,处理负数效率比int64更高
fixed32uint32总是4个字节。如果数值总是比总是比228大的话,这个类型会比uint32高效。
fixed64uint64总是8个字节。如果数值总是比总是比256大的话,这个类型会比uint64高效。
sfixed32int32总是4个字节
sfixed64int64总是8个字节
boolbool布尔类型
stringstring一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本
bytesstring处理多字节的语言字符、如中文
enumenum枚举
messageobject of class自定义的消息类型

2.2、使用protobuf编译器生成C++类  

# protobuf编译器, 编译源码得到的 protoc.exe
# 语法
# --cpp_out 生成的c++类的位置

protoc.exe xxx.proto --cpp_out=目录

2.3、使用C++ API来读写消息

  • 读: 变量名()

  • 写: set_变量名(arg1, arg2, ...)

  • 部分C++接口函数

Person p;
//序列化 output为传出参数
p.SerializeToString(std::string* output);

//解析
Person pp;
pp.ParseFromString(output);

2.4、VS中的使用

  • 将生成的C++类和头文件添加到项目
  • 在项目文件中的头文件中引用
  • 注意:VS配置需要在C/C++-》预处理器-》添加宏"PROTOBUF_USE_DLLS"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值