链接:http://blog.csdn.net/menggucaoyuan/article/details/43603829
谷歌最近发布了 v3 版本的 protobuf,以前的 protobuf 被称之为 v2,二者之间的区别其特点见我上一篇 blog《protobuf一些注意事项》。
个人以为 v3 要比 v2 好处就在于:简洁,且二者的新版本都共同支持了新的数据类型:map。相比 v2,它去掉了 required 等选项,只保留了 repeated 选项,还添加了时间等比较常用的数据类型(当然暂时还没有实现)等等。唯一的缺点就是,v3 还没有发布 beta 版,目前的版本是 protobuf-3.0.0-alpha-1。
为了测试 v3 对 v2 的兼容性,我写了一个程序,v2 的协议内容如下:
syntax = "proto2";
package proto3_proto;
message Message {
enum Humour {
UNKNOWN = 0;
PUNS = 1;
SLAPSTICK = 2;
BILL_BAILEY = 3;
}
optional string name = 1;
optional Humour hilarity = 2;
optional uint32 height_in_cm = 3;
optional bytes data = 4;
optional int64 result_count = 7;
optional bool true_scotsman = 8;
optional float score = 9;
repeated uint64 key = 5 [packed = true];
// repeated uint64 key = 5;
}
message MessageArray {
map<string, Message> msg_map = 1;
}
上面的协议内容基本上把 protobuf 各种数据类型都包括了,下面是对应的 v3 版本协议:
syntax = "proto3";
package proto3_proto;
message Message {
enum Humour {
UNKNOWN = 0;
PUNS = 1;
SLAPSTICK = 2;
BILL_BAILEY = 3;
}
string name = 1;
Humour hilarity = 2;
uint32 height_in_cm = 3;
bytes data = 4;
int64 result_count = 7;
bool true_scotsman = 8;
float score = 9;
repeated uint64 key = 5[packed = true];
}
message MessageArray {
map<string, Message> msg_map = 1;
}
v3 的协议内容看着比 v2 清爽一些。 写了一个测试程序,其内容就不列出来了,我放在了百度网盘,感兴趣的自己去下载。只要是 v3 没有改变 v2 的部分,二者编码后的内容是一致的。
待 v3 的 stable 版本发布出来时候,它可能就开始支持时间等一些常用类型了,据说还可以把内容序列化为 json 格式,到时候再把更新本篇的内容。