ProtoBuf是何方神圣?她是序列化结构数据的方法,看官可能要问了,这序列化数据结构的方法有很多,这个protobuf来凑什么热闹,大家注意啊,我们的protobuf可是 和语言无关(支持java C++ python等)、平台无关、可以扩展、灵活高效,拥有自动化机制的序列化数据结构的function,那分分钟实现更小、更快、更易的三大方针五大纲领,她呀可以用在储存、通信等方面,兼容性好还可扩展,你说气人不?
比较
说这么多废话,是不是还有可爱的程序员们没有领会精神?那咱们先从序列化开始,大概五百年前有一位老人家在等侄子的回信、跑题了,序列化,之前我一看他就头疼,怎么能长得如此狰狞,不过经过我不离不弃、坚持不懈的努力,他终于被我理解了,无疑就是将(结构)数据或者对象转换成能被储存和传输的格式,咱们一般用什么储存和传输,据我所知 二进制算一个,但是序列化仅仅如此倒不值得我呕心沥血,关键他还能保住序列化结果还能够被复原成原来(青春不老)的对象和数据。
这个网络世界老是拿xml、json来说事,我就不是很明白,xml作为一种扩展标记语言、json源于js,怎么能……是、我们protobuf是小、快、简单,怎么了,萝卜白菜各有所长;正经点说,数据结构化主要是开发或者业务层、侧重可读性、不二意,数据序列化面向通信或储存、侧重效率和压缩。
xml可衍生出标记和表达网络资源结构的html,还衍生出表达网络资源关系和语义的RDF/RDFS
json则更为常见,这里就不说了
具体来说怎么用protobuf呐?这个用起来好像很简单,网上也有很多资料,我这里简单举个栗子:
syntax = "proto3";
message SearchRequest {
singular string query = 1;
repeated int32 page_number = 2;
repeated Result results = 1;
}
message Result {
string url = 1;
string title = 2;
}
类型![](https://i-blog.csdnimg.cn/blog_migrate/9e194f9f33af76e7fe5d465be7240207.png)
默认值:
- 数值类型默认值为 0。
- 布尔类型默认值为 false。
- 字符串默认值为空字符串。
- 字节类型默认值是空字节。
- 枚举类型默认值是其定义中的第一个值,它必须为 0。
- repeated字段的默认值为空(通常是相应编程语言的空列表)
- 消息类型的默认值没有设置。它的具体值与使用的编程语言有关。
这个大神提醒我们注意:
- 标量消息字段,消息被解析时,是否被设定为默认值不可知
- 如果设置的值会导致某些不想发生的行为,则不定义该字段
- 序列化时,标量消息字段的值设为默认值,则这个值不会被序列化
- 枚举值她的第一个元素都应该是一个等于0的常量(兼容proto2)常量的值在32位整型值范围内
- proto3的语法不容许直接使用proto2的枚举类型(被导入的proto2的消息使用,没有问题)
更新
注意
- 在原来的message格式上修改,不改原有的字段
- 可删除字段,新的message类型不要使用该字段的编号
- int32,uint32,int64,uint64 和 bool 是兼容的,fixed32 与 sfixed32 兼容,fixed64 与 sfixed64 兼容,可类型转换
消息类型
any:可以像嵌入类型一样使用消息,无需拥有其proto定义,一个any含任意字节序列化消息、一个url
oneof:如果你的message含许多可选字段,最多同时设置其中一个字段,使用oneof强制执行节省内存
oneof字段将自动清除oneof其他成员,设置了多个字段只有最后一个字段有效
JSON映射
截图自https://blog.csdn.net/qq_22660775/article/details/89163881 上面的图也是 上面的文字也是 ——搬运工
https://www.jianshu.com/p/cae40f8faf1e 栗子不错
https://www.jianshu.com/p/a24c88c0526a 比较全
https://blog.csdn.net/qq_22660775/article/details/89163881