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协议

  1. 什么是Protobuf协议?

    和json xml一样,也是一种数据交换格式.可以序列化与反序列化.不同的是protobuf是一种变长协议,格式较为麻烦,但是效率很高.

    参考文档:

    http://blog.csdn.net/yueqian_scut/article/details/47606599 (variant算法)

  2. Protobuf的相关资料

    http://blog.csdn.net/shuliwuflying/article/details/50814123

    http://www.jianshu.com/p/e0d81a9963e9



  3. protobuf语言:

    http://www.cnblogs.com/dkblog/archive/2012/03/27/2419010.html

    



  1. .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协议的主要内容,如果未能解决你的问题,请参考以下文章

ProtoBuf协议

[序列化协议] --- protobuf

Google.Protobuf.InvalidProtocolBufferException:协议消息包含无效标签(零)

千万级弹幕通信协议protobuf工程实践

wireshark内置支持protobuf吗

Protobuf协议的Java应用例子