序言
Protocol Buffer 和 XML、JSON一样都是结构数据序列化的工具,但它们的数据格式有比较大的区别:
- 首先,Protocol Buffer 序列化之后得到的数据不是可读的字符串,而是二进制流
- 其次,XML 和 JSON 格式的数据信息都包含在了序列化之后的数据中,不需要任何其它信息就能还原序列化之后的数据;但使用 Protocol Buffer 需要事先定义数据的格式(.proto 协议文件),还原一个序列化之后的数据需要使用到这个定义好的数据格式(网上很多java的使用方法介绍。首先就是编辑一个proto的数据结构文件,就像是一个java domain 类。后面就是针对该domain类进行 设置属性值和获取属性)
- 最后,在传输数据量较大的需求场景下,Protocol Buffer 比 XML、JSON 更小(3到10倍)、更快(20到100倍)、使用 & 维护更简单;而且 Protocol Buffer 可以跨平台、跨语音使用(车载终端是直接穿的2进制数据,速度和Protocol Buffer是一样的)
通过将结构化的数据(拥有多种属性)进行序列化,从而实现(内存与硬盘之间)数据存储和交换的功能(这个东西的使用除非修改原有的数据结构否则几乎不会改动,就是获取对象类属性和设置对象属性cuiyaonan2000@163.com)
- 序列化: 按照
.proto
协议文件将数据结构或对象
转换成二进制流
的过程 - 反序列化:将在序列化过程中所生成的
二进制流
转换成数据结构或对象
的过程
目前实现方式有2种:
- 一种是用google的命令将.proto文件转换成 JavaBean文件
- 另外一种就不需要依赖.proto文件了,可以直接对POJO进行序列化和反序列化,使用起来非常简单。
先定义.proto文件,然后编译成javabean. 在序列化和反序列化.~~~~这个很简单
public class Test {
public static void main(String[] args) throws IOException {
UserOuterClass.User.Builder userBuilder = UserOuterClass.User.newBuilder();
userBuilder.setName("子悠");
userBuilder.setAge(18);
// userBuilder.setComment("this is comment");
System.out.println("\n**********************序列化*****************************");
byte[] bytes = userBuilder.build().toByteArray();
System.out.println("bytes length is " + bytes.length);
for (int i = 0; i < bytes.length; i++) {
System.out.print(bytes[i] + " ");
}
System.out.println("\n**********************反序列化*****************************");
UserOuterClass.User user = UserOuterClass.User.parseFrom(bytes);
System.out.println(user.getName());
}
}
protobuf文件语法
文件结构
//指定版本
syntax = "proto2";
//定义包名
package com.test.model;
// 生成的包名
option java_package="com.pancm.protobuf";
//生成的java名
//注:这里使用的是proto3,相关的注释我已写了,这里便不再过多讲述了。需要注意一点的是proto文件和生
//成的Java文件名称不能一致!
option java_outer_classname = "UserInfo";
//定义结构数据
message User {
//必选字段 第1个属性
required string name = 1;
//必选字段 第2个属性
required int32 age = 2;
//可选字段 第3个属性
optional string comment = 3;
}
数据类型
.proto TypeJava Typedoubledoublefloatfloatint32intint64intuint32intuint64longsint32intsint64longfixed32intfixed64longsfixed32intsfixed64longboolbooleanstringStringbytesByte/Stringmapjava.util.Map
转换工具下载与使用
下载地址
https://github.com/protocolbuffers/protobuf/releases/tag/v3.13.0
转换命令把.proto文件和protoc.exe(生成Java文件的软件)放到E盘目录下的protobuf文件夹下,然后再到该目录的dos界面下输入:protoc.exe --java_out=文件绝对路径名称
。 例如(输入完之后,回车即可在同级目录看到已经生成好的Java文件,然后将该文件放到项目中该文件指定的路径下即可。):
protoc.exe --java_out=E:\protobuf Test.proto
第二种
SpringBoot--实战开发--Protocol Buffer(五十四) - 简书