protobuf一些注意事项

读完https://developers.google.com/protocol-buffers/docs/proto,有以下心得:

1 default value。bool的默认值是false,数值的默认值是0,enum的默认值是其第一个元素,string的默认值是空字符串。

2 tag id. id 1-15占用1个字节,16到2047占用两个字节。所以1-15要留个频繁使用的字段,不要刚开始定义字段的是时候都分配出去。

tag值最小是1, 最大是(2^29 - 1)即536,870,911,但是要避开19000到19999,这是protobuf内置的类型要用到的tag id。

3 enum可以有alias。enum的值不能为负数。

enum EnumAllowingAlias {

option allow_alias = true;

UNKNOWN = 0;

STARTED = 1;

RUNNING = 1;

}

enum EnumNotAllowingAlias {

UNKNOWN = 0;

STARTED = 1;

// RUNNING = 1;  // Uncommenting this line will cause a compile error inside Google and a warning message outside.

}

4 当协议更新的时候,如果某个字段过时了,就可以更改field的name,如"OBSOLETE_xxx",以告诉使用者不要在使用这个field。

也可以更改field type,前提是tag id不变,这些类型就是兼容的(之所以能兼容,按照我的理解,一个field就是一个kay-value对,tag id为key,value即为值,而type只是在序列化和反序列化的时候起到解释值的作用,并无其他作用;key = (tag << 3) | wire_type,即类型占用最多3个字节,所以有上面的tag范围是2^29 - 1)。如下几个类型是兼容的:

A int32 uint32 int64 uint64 bool

B sint32 siint64

C string bytes (字符类型是UTF8)

D fixed32 sfixed32 fixed64 sfixed64

E optional repeated

F default([default = value])value也可以被修改

5 protoc --proto-path= --cpp_out= --java_out= file.proto

--proto-path可以被-I代替。

6 protobuf对repeated压缩不够好,所以尽量在后面加上[packed = true]。

7 序列化的时候不能把多个message序列化后的内容放在一起发出去,尽量以len1 + msg1 + len2 + msg2这种形式发送。

时间: 2024-11-26 06:34:54

protobuf一些注意事项的相关文章

protobuf v3测试

谷歌最近发布了v3版本的protobuf,以前的protobuf被称之为v2,二者之间的区别其特点见我上一篇blog<protobuf一些注意事项>. 个人以为v3要比v2好处就在于:简洁,且二者的新版本都共同支持了新的数据类型:map.相比v2,它去掉了required等选项,只保留了repeated选项,还添加了时间等比较常用的数据类型(当然暂时还没有实现)等等.唯一的缺点就是,v3还没有发布beta版,目前的版本是protobuf-3.0.0-alpha-1. 为了测试v3对v2的兼容性

最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)

导读 1. 什么是序列化? 2. 为什么要序列化?好处在哪里? 3. C++对象序列化的四种方法 4. 最常用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯.这个将 程序数据转化成能被存储并传输的格式的过程被称为"序列化"(Serialization),而它的逆过程则可被称为"反序列化" (Deserialization). 简单

在Windows上一键编译各种版本的Protobuf

所需工具 : cmake  for  windows 和  git for windows 原理:protobuf 是google的一个开源项目,其源代码在github上可以下载到,并且源码都采用cmake来构建,所以我们可以把源码下载到本地,然后了利用cmake构建本地工程,然后编译. 步骤一:下载源码 复制以下代码,保存到 download_protobuf_source.bat 文件中,运行即可 ::参考文章 https://github.com/google/protobuf/blob/

WCF服务上应用protobuf z

protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样 的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多.虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的 语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持java.c++.python等语言环境.通过将这些类包含在项目 中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作. protobuf在google中是一个比较核心的基础库,作

关于Protobuf在游戏开发中的运用

最近在研究protobuf在项目中的使用,由于我们项目服务端采用的是C++,客户端是cocos2dx-cpp,客户端与服务端的消息传输是直接对象的二进制流.如果客户端一直用C++来写,问题到不大,但是后期有想法将客户端用lua来写(可以实现苹果平台的新增更新),这个时候问题就出现了(传输的消息定义无法在lua中得到扩展).这个时候就想到了protobuf. protobuf原本是google的一个开源项目(网上有很多资料),它的功能是将类似的对象(class)转化成字符串,而且这个字符串比jso

最经常使用的两种C++序列化方案的使用心得(protobuf和boost serialization)

导读 1. 什么是序列化? 2. 为什么要序列化?优点在哪里? 3. C++对象序列化的四种方法 4. 最经常使用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序猿在编写应用程序的时候往往须要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的还有一台计算机上以实现通讯.这个将程序数据转化成能被存储并传输的格式的过程被称为"序列化"(Serialization),而它的逆过程则可被称为"反序列化"(Deserialization). 简

Google Protobuf扩展字段使用

背景说明 Google Protobuf中不支持数据结构的派生关系,因此,如果在存在派生体系的对象中定义数据结构时,通过组合方式对数据结构进行组合,则需要对基类对象提供的通用接口进行重载或在外部进行动态转型才能达到获取或设置数据的目的. 因此考虑使用Google Protobuf提供的extension扩展机制解决数据结构之间的不能派生的问题,以此来达到减少重复工作量和便于维护代码的目的. 使用说明 定义公共数据类型 描述: 此数据类型为对象派生体系同基类提供的公共数据类型 示例: 1 // 公

mac安装protobuf

首先从http://code.google.com/p/protobuf/下载protobuf 之后需要安装brew [非root] brew install autoconf[need to across the great wall and reach the bigger world] brew install automake brew install libel [root] sudo ./autogen.sh ./configure(先autogen.sh才有,如果没有权限chmod

修改现有消息类让.net core项目支持Protobuf - 【无需使用 [ProtoBuf.ProtoContract] 的方法】

前言 第二次发博客,希望大家多多鼓励!!! 又接无上老板的一个需求,需要让.net core消息发送端跟消息接收端通信的消息是protobuf格式的(基于protobuf比json小一倍数据量,独特的编码.没有fieldname等),但现有项目的消息类数量巨多,按照网上的方案是安装protobuf.net 这个nuget包,然后需要给消息类一个一个添加[ProtoBuf.ProtoContract].[ProtoBuf.ProtoMember(index)]等Attributes,更可悲的是,还