Protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。除了比Json、XML有速度上的优势和使用上的方便外,protocolbuf还可以做到向前兼容和向后兼容。
protobuf 虽然只支持JAVA、C++和Pyton,但protobuf社区的protobuf.net组件让protobuf可以支持更多的语言,其中就包括了C#。
protobuf协议
定义protobuf协议必须创建一个以.proto为后缀的文件,以本篇 创建了一个名为myproto.proto的文件,如下:
- package ProtoTest;
- message TestInfo{
- required string test = 1;
- optional int32 num = 2;
- }
- message Msg{
- required int32 id = 1;
- optional TestInfo msg = 2;
- optional string str = 3 [defalut="Test String"];
- }
package ProtoTest;
message TestInfo{
required string test = 1;
optional int32 num = 2;
}
message Msg{
required int32 id = 1;
optional TestInfo msg = 2;
optional string str = 3 [defalut="Test String"];
}
package在Java里面代表这个文件所在的包名,在c#里面代表该文件的命名空间,message代表一个类, required 代表该字段必填,optional 代表该字段可选,并可以为其设置默认值,string的默认值格式为[defalut="字符串"] 整型的默认值格式为[defalut=23333]
下面是protobuf在.proto文件中的字段类型转换表:
.proto Type |
Notes |
C++ Type |
Java Type |
Python Type[2] |
double |
double |
double |
float |
|
float |
float |
float |
float |
|
int32 |
Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. |