啰嗦几句:

有句话这么说:一条消息数据,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一,总体看来ProtoBuf的优势还是很明显的。

简单说来 Protobuf 的主要优点就是:简单,快。网上很多与json,xml的对比,可以找来看看,这里不比较了。

Protobuf 有如 XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对你的结构化数据轻松读写。

它有一个非常棒的特性,即“向后”兼容性好,人们不必破坏已部署的、依靠“老”数据格式的程序就可以对数据结构进行升级。这样您的程序就可以不必担心因为消息结构的改变而造成的大规模的代码重构或者迁移的问题。因为添加新的消息中的 field 并不会引起已经发布的程序的任何改变。

Protobuf 语义更清晰,无需类似 XML 解析器的东西(因为 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操作)。

使用 Protobuf 无需学习复杂的文档对象模型,Protobuf 的编程模式比较友好,简单易学,同时它拥有良好的文档和示例,对于喜欢简单事物的人们而言,Protobuf 比其他的技术更加有吸引力。

使用:

目前Protobuf 最新的版本是3.1的,使用Protobuf 首先要对Message实体进行预编译(不要嫌麻烦,好东西都是这样的),所以这里需要先下载 Protobuf 3.1 编译器 ,我这里已经上传上去了:http://download.csdn.net/detail/kokjuis/9729750 点击打开链接

加压以后里面有2个目录 bin 、include。

编译之前要先定义你的proto文件(Protobuf 编译器编译用的格式是proto,到时可以编译出.java文件)。例如:

syntax = "proto3"; //指定版本,必须要写(proto3、proto2)message Header{//参数类型 参数名称=字段编码值
string identify=1;// 协议标志string version=2;// 协议版本string appKey=3;// appKeyint32 msgType=4;// 消息类型int32 direction=5;// 消息方向int64 msgTime=6;//消息时间string ack=7;//ack}\\----------------第二个文件-------------------syntax = "proto3"; //指定版本,必须要写(proto3、proto2)//message是固定的。UserInfo是类名,可以随意指定,符合规范即可
message User{//参数类型 参数名称=字段编码值
string senderId=1;// 发送人IDstring receiverId=2;// 接受人IDstring senderName=3;// 发送人姓名string receiverName=4;// 接收人姓名string senderHeadPortrait=5;// 发送人头像URL}//-------------第三个文件-------------
syntax = "proto3"; //指定版本,必须要写(proto3、proto2)message Body{//参数类型 参数名称=字段编码值
string content=1;// 内容int32 contentLength=2;// 内容长度int32 contentType=3;// 内容类型int32 msgType=4;// 消息类型}

参数后面的数字是字段编码值:

有了该值,通信双方才能互相识别对方的字段。当然相同的编码值,其限定修饰符和数据类型必须相同。

编码值的取值范围为 1~2^32(4294967296)。

其中 1~15的编码时间和空间效率都是最高的,编码值越大,其编码的时间和空间效率就越低(相对于1-15),当然一般情况下相邻的2个值编码效率的是相同的,除非2个值恰好实在4字节,12字节,20字节等的临界区。比如15和16.

1900~2000编码值为Google protobuf 系统内部保留值,建议不要在自己的项目中使用。

protobuf 还建议把经常要传递的值把其字段编码设置为1-15之间的值。

消息中的字段的编码值无需连续,只要是合法的,并且不能在同一个消息中有字段包含相同的编码值。

下面是参考的数据类型:

然后打开CMD,cd到bin目录,输入编译命令编译文件:

protoc --proto_path=G:\Tools\protoc-3.1.0-win32\bin  --java_out=G:\Tools\protoc-3.1.0-win32\bin  G:\Tools\protoc-3.1.0-win32\bin\Header.proto

命令解释:

protoc 是命令,--proto_path是输入路径(可以用 --I 代替),--java_out是输出路径,最后面跟着的是要编译的文件路径

执行命令过后,就能得到编译好的.java文件,文件不需要改,直接复制到工程中使用,跟实体类差不多。

在java中使用还需要一个jar包:http://download.csdn.net/detail/kokjuis/9729811 点击打开链接

如果想要做消息嵌套,可以这样,然后生成这个文件即可:

syntax = "proto3"; //指定版本,必须要写(proto3、proto2)import "Header.proto";
import "User.proto";
import "Body.proto";message Message{
Header header=1;
User user=2;
Body body=3;
}

使用的时候:

 UserInfoOuterClass.UserInfo.Builder userInfo = UserInfoOuterClass.UserInfo.newBuilder();userInfo.setReceiverId(message.getUserInfo().getReceiverId());userInfo.build();
从protobuf转json
Message someProto = SomeProto.getDefaultInstance();
String jsonFormat = JsonFormat.printToString(someProto);从json转protobuf
Message.Builder builder = SomeProto.newBuilder();
String jsonFormat = load json from source;
JsonFormat.merge(jsonFormat, builder);

protobuf 3 的简单使用相关推荐

  1. Protobuf介绍及简单使用(上)

    目录 Protobuf 介绍 优势 protobuf语法 Specifying Field Rules Data type Data name Number Protobuf注释 保留字段与标识符 s ...

  2. Protobuf介绍及简单使用(下)之文件读写

    目录 Bin二进制文件 写bin文件API 用例一 读bin文件API 用例二 Prototxt文件 写Prototxt文件API 用例三 读Prototxt文件API 用例四 caffe中的prot ...

  3. linux下使用protobuf实现简单配置功能

    http://blog.csdn.net/flyan338/article/details/8448518 前言: 程序一般需要load一些参数列表,一般来说我们可以通过linux自带的命令行解析函数 ...

  4. 简单的使用protobuf和protostuff

    在我们的开发过程中,序列化是经常需要处理的问题,比如在做分布式访问数据时,或者是在做redis缓存存储数据时,如果我们涉及的知识面不够广的话,可能会简单的使用JDK的序列化,也即在需要序列化的类上im ...

  5. 让CoreData更简单些

    从简书迁移到掘金 前言 本文并不是CoreData从入门到精通之类的教程, 并不会涉及到过多的原理概念描述, 而是介绍如何让CoreData的使用变得更加简单明了, 方便亲民. 全文约六千字, 预计花 ...

  6. 在C#中使用gRPC及protobuf简介

    简介 gRPC提供了很多的语言开发包,C#也可以很容易使用.结合使用protobuf及其编译器,很容易地生成了gRPC的服务stub和proxy. 在CSharp中使用gRPC和Protobuf,可以 ...

  7. BeetleX之简单HTTP/HTTPS实现

    在通讯应用中很多时候需要和已有标准的应用协议进行通讯,针对这情况就要针对相应协议的实现:标准协议上考虑的情况比较多,所以协议的复杂度也相对高些,对比之前的Protobuf通讯的简单协议来说则会复杂.接 ...

  8. http协议get_BeetleX之简单HTTP/HTTPS实现

    在通讯应用中很多时候需要和已有标准的应用协议进行通讯,针对这情况就要针对相应协议的实现:标准协议上考虑的情况比较多,所以协议的复杂度也相对高些,对比之前的Protobuf通讯的简单协议来说则会复杂.接 ...

  9. proto-buf模型格式测试一例

    深度学习神经网络的输出模型有多种格式,这其中有一种格式使用比较广泛,并且背景深厚,它就是protobuf格式,关于这个格式的介绍请参考这篇博客: ONNX格式解析之google protobuf解析_ ...

  10. 高效序列化protobuf和protostuff的区别

    一.前言 在我们的开发过程中,序列化是经常需要处理的问题,比如在做分布式访问数据时,或者是在做redis缓存存储数据时,如果我们涉及的知识面不够广的话,可能会简单的使用JDK的序列化,也即在需要序列化 ...

最新文章

  1. 同等质量下那种图片格式小_八个PPT图片处理必会的神技巧,帮你轻松做出高质量PPT...
  2. 2018广技师C语言专插本试题,专插本2016广技师C语言专插本考试大纲已核对.doc
  3. 登陆拦截拦截ajax,过滤器实现登录拦截需要注意的问题(AJAX请求的处理)
  4. linux文件比较,合并,查找重复行
  5. python语言的特点强制可读_python程序语言设计第二讲(笔记)
  6. C语言中的除法运算符
  7. 如何找python 包的位置
  8. 中文核心期刊投稿指南
  9. 每个大主播都是满屏弹幕,怎么做到的?Python实战无限刷弹幕!
  10. veu-cli 3.0使用教程
  11. C4D动画如何提交云渲染农场快速渲染?
  12. BZOJ3039 玉蟾宫(单调栈)
  13. 阿里云香港服务器解析后域名无法访问
  14. 图片理解引擎算法实现简介
  15. 设计LDO电路需考虑因素
  16. 基于OpenCV的手指只数检测
  17. DiskGenius 复制磁盘 提示 设备未就绪
  18. Linux系统设置手动ip,科学网—linux手动设置静态ip - 张志翔的博文
  19. SpringBoot+Vue项目漫画网站
  20. 阿里云服务 - Java实现短信验证码发送 --(完整教程)

热门文章

  1. GitLab服务更换ip后项目地址ip如何修改
  2. macOS 终端打开提示:zsh compinit: insecure directories
  3. LeetCode 430. Flatten a Multilevel Doubly Linked List【链表/DFS/递归/迭代】中等
  4. 【可收藏】3W字,Docker 从入门到精通
  5. 跨域问题,以及nginx应对403 ACAO的处理办法
  6. java 常量pi_Java-常量
  7. vue项目运行后自动打开浏览器
  8. 【图解CAN总线】-2-详述CAN总线电平
  9. 封存了一年的网络编程笔记
  10. 正则表达式的基本原理