Protobuf协议
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Protobuf协议相关的知识,希望对你有一定的参考价值。
参考技术A 在网络通信中,我们经常需要通过一种约定俗称的方式来进行数据交互。在这中间,有很多如xml,json等等很常见的数据格式。xml是一种标签语言,通过<tag>content</tag>来描述数据内容,出现时间最早,应用最广泛,但是传输效率低。
json作为一种轻量级的数据交换格式,其无效的字符数远远低于xml,且原生被js支持,故经常出现在前端请求中以及app与服务器的数据交互。
protobuf是google的一种数据交换格式,相比于其他的几种交互方式,其优势在于数据的重编码,在传输时会将其编译为二进制数据流,而当需要使用时再进行反序列化。
protobuf支持几乎绝大多数的语言。
通过proto文件,我们可以了解到一个数据的详细类型。
在官方示例中可以看到一个数据类型的声明方法:message 对象 。在中则是添加相应的字段描述,每个字段描述如下
数据类型为protobuf声明的数据类型,每个类型在不同的语言上均有特定的映射。
或可以是一个声明的自定义数据类型。
声明完成后通过protoc编译为特定语言的头文件。
引入头文件后 首先声明一个对象
通过person.xxx可以直接对某个字段进行赋值
在序列化过程中有可能因为required未被赋值而导致序列化失败
序列化成功后便可以将二进制数据发送出去
收到对应的数据后,我们需要从二进制数据中获取对应的对象
person = addressbook_pb2.Person()
person.ParseFromString(pb_bin)
ProtoBuf协议
什么是Protobuf协议?
和json xml一样,也是一种数据交换格式.可以序列化与反序列化.不同的是protobuf是一种变长协议,格式较为麻烦,但是效率很高.
参考文档:
http://blog.csdn.net/yueqian_scut/article/details/47606599 (variant算法)
Protobuf的相关资料
protobuf语言:
http://www.cnblogs.com/dkblog/archive/2012/03/27/2419010.html
.proto转.java的开源库
http://www.jianshu.com/p/3a543757d086 (利用gradle配置,同步一下,走task即可生成java文件)
java对象与16进制字符串互转需要注意的问题:
1)对于proto中bytes类型得到java的字符串:
String mac1 = DataTransfer.bytes2HexString(authRequest.getMacAddress().toByteArray());
2)java对象转16进制报文
凡是数据数字,都是设置的10进制数据.
凡是字符串,都是native string.
本文出自 “行意天下” 博客,请务必保留此出处http://4259297.blog.51cto.com/4249297/1977287
以上是关于Protobuf协议的主要内容,如果未能解决你的问题,请参考以下文章
Google.Protobuf.InvalidProtocolBufferException:协议消息包含无效标签(零)