一、介绍

Google提供一个具有高效的协议数据交换格式工具库(类似Json),但相比于Json,Protobuf有更高的转化效率,时间效率和空间效率都是JSON的3-5倍。google 提供了三种语言的实现:java、c++ 和 python,每一种实现都包含了相应语言的编译器以及库文件。

二、特点

Xml、Json是目前常用的数据交换格式,它们直接使用字段名称维护序列化后类实例中字段与数据之间的映射关系,一般用字符串的形式保存在序列化后的字节流中。消息和消息的定义相对独立,可读性较好。但序列化后的数据字节很大,序列化和反序列化的时间较长,数据传输效率不高。

Protobuf和Xml、Json序列化的方式不同,采用了二进制字节的序列化方式,用字段索引和字段类型通过算法计算得到字段之前的关系映射,从而达到更高的时间效率和空间效率,特别适合对数据大小和传输速率比较敏感的场合使用。

三、结构

proto文件定义了协议数据中的实体结构(message ,field)。

举例如下:

//要生成的类Person
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4; }

(1)关键字message: 代表了实体结构,由多个消息字段(field)组成。

Message中定义的全部属性在class中全部为private的。

Message的嵌套使用可以嵌套定义,也可以采用先定义再使用的方式。

(2)消息字段field: 即属性,包括字段规则+数据类型+字段名+属性顺序号+[默认值]。

  • 数据类型:常见的原子类型都支持

  • 字段规则:

    • required:对于required的字段而言,必须初始化字段,否则会抛异常
    • optional:可选字段,可以不必初始化。如果没初始化,那么将赋予该字段编号一个默认值。int或者char数据类型默认为0,string默认为"",bool默认为false,嵌套message默认为构造,枚举则为第一个。
    • repeated:数据可以重复(相当于java 中的Array或List)
  • 字段唯一标识:序列化和反序列化将会使用到。比如上面的=1; =2;

  • 默认值:在定义消息字段时可以给出默认值。比如 [default = HOME]

四、选择版本

syntax 声明可以选择protobuf的编译器版本(v2和v3)

  • syntax="proto2":选择2版本,各个字段必须明确标注编号以确定序列化后二进制数据字段的位置
  • syntax="proto3":选择3版本,没有强制使用字段编号,proto3 已舍弃 required 字段,optional 字段也无法显示使用

五、Intellij IDEA中使用Protobuf

1、下载个protoc.exe

2、编辑个.proto文件

在proto文件下创建一个AddressBook.proto。用的是proto2版本

里面的结构就是 AddressBook下有很多个Person。

每个Person必须有一个name、必须有一个id、可选有email、很多个PhoneNumber。

每个PhoneNumber必须有一个number、可选PhoneType。

PhoneType取值必为0或1或2

写的内容举例如下:

syntax = "proto2";

//生成的类会放在protoc.exe同目录下的tutorial
//如果.proto文件中写了java_package,就以java_package为准。
package beans;
//生成的类会放在protoc.exe同目录下的com.proto.tutorial下
//option java_package = "com.proto.tutorial";
//最终成的类名
//option java_outer_classname = "AddressBookProtos"; message Person { required string name = 1; required int32 id = 2; . optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } message AddressBook { repeated Person person = 1;
package tutorial; option java_package = "com.proto.tutorial"; option java_outer_classname = "AddressBookProtos"; message Person { required string name = 1; required int32 id = 2; // Unique ID number for this person. optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } message AddressBook { repeated Person person = 1; }

3、将.proto文件转成Java类

控制台中执行protoc命令,依次将.proto文件转成Java类

protoc.exe -I=F:/workspace/proto-test/src/main/resources/proto --java_out=F:/workspace/proto-test/src/main/java/beans F:/workspace/proto-test/src/main/res
ources/proto/AddressBook.proto protoc.exe -I=(proto文件所在绝对路径,不包括proto文件本身)  --java_out=(文件输出目录) (proto文件所在绝对路径,包括proto文件名)

4、相关包

<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.7.1</version>
</dependency> <dependency>
<groupId>com.googlecode.protobuf-java-format</groupId>
<artifactId>protobuf-java-format</artifactId>
<version>1.2</version>
</dependency>

5、.proto文件语法高亮显示

需要安装Protobuf Support插件,

依次点击Intellij中的“File”-->"Settings"-->"Plugins"-->"Browse repositories",

输入Protobuf,点击install

6、具体使用举例

AddressBookProtos.AddressBook .Builder  addressBook= AddressBookProtos.AddressBook .newBuilder();
AddressBookProtos.Person .Builder person= AddressBookProtos.Person .newBuilder();
person.setName("Mike");
addressBook.setPerson(person);

最新文章

  1. swift 可选类型(optional)--- swift 入门
  2. 【转】iOS UIApplication详解
  3. Spring自动注入properties文件
  4. Web 开发人员和设计师必读文章推荐【系列二十九】
  5. CSS3——让最后一行显示省略号
  6. 2015年12月01日 GitHub入门学习(一)GitHub简介
  7. xcode黑科技
  8. 常州培训 day7 解题报告
  9. Projective Texture的原理与实现
  10. 获取CentOS软件源中的updates包
  11. Java6 WebService学习
  12. ELK搭建
  13. Android实训案例(七)——四大组件之一Service初步了解,实现通话录音功能,抽调接口
  14. CentOS_7下安装MySQL
  15. Java基础——枚举详解
  16. 爆破root密码hash John the Ripper和hydra爆破ssh密码
  17. iOS- 什么是GitHub?关于它的自我介绍「初识 GitHub」
  18. jquery.lazyload插件实现图片延迟加载详解
  19. python 增加矩阵行列和维数
  20. Linux 硬链接和软链接

热门文章

  1. sql 删除重复数据
  2. 分享一个开源的JavaScript统计图表库,40行代码实现专业统计图表
  3. uva10570 Meeting with Aliens
  4. Metinfo 5.3.19管理员密码重置漏洞复现
  5. 目录下 shift 右键菜单 打开cmd 或者在 地址栏输入cmd 回车进入cmd
  6. cocos creator 小记
  7. 爬虫学习之第一次获取网页内容及BeautifulSoup处理
  8. 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)
  9. 下载GitHub上的dnSpy源码
  10. nodejs实现网站数据的爬取