读完protobuf一些文档,写点东西,权作记忆。
google发布了protobuf v3,为了pb更好用,更跨语言,他对protobuf v2做了以下change:
1. Removal of field presence logic for primitive value fields(匪夷所思,留存以待以后翻译出来), 删除required(大大地赞同,即保留repeated,required和optional都不要了,默认就是optional),删除默认值(不明白)。谷歌生成这些改变视为了更好的兼容Android Java、Objective C和Go语言;
2. 删除对unknown field的支持;
3. 不再支持继承,以Any type代之;
4 修正了enum中的unknown类型;
5 支持map;
protobuf v2和v3都支持map了,其声明形式如下:
message Foo {
map values = 1;
}
注意,此处的map是unordered_map。
6添加了一些类型集,以支持表述时间、动态数据等;
7 默认以json形式代替二进制进行编码。
目前v3 alpha版仅仅实现了1-5这五个feature,6和7还未支持。新添加了syntax关键字,以指明proto文件的protobuf协议版本,不指明则是v2。如:
// foo.proto
syntax = "proto3";
message Bar {...}
如果你目前使用了v2,那么暂时不支持你切换到v3,我们还会对v2提供支持。如果你是新手,那就大胆使用v3吧。
1 go的protobuf实现不支持RPC。
2 go的protobuf实现了一个go的插件protoc-gen-go,他放置的地方必须在$GOBIN里面,默认放在$GOPATH/bin。它也必须在$PATH里面,以让protoc编译器找到。protoc把proto文件编译成go的源码文件,其名称后缀是.pb.go