Protocol Buffer序列化/反序列化---初体验(java版)
今天闲遐时学习了
Protocol Buffer
在网上看到了许多资料,其中不泛精品,想要详细了解的请看文章结尾的友情链接,我这里就做加深印象,快速入门的一个完整的demo,仅此而已.
学完你可以得到什么:
- 可以使用protoc工具序列化类,反序列化类
- 基于java语言的对protoc工具的基本使用
- 基本protoc的基础api使用
首先我们需要下载官方的编译工具,
翻墙版: 官方文档
不翻版:我的仓库
整体流程:序列化一个实体类,在反序列出来得到结果:
先放出结果来瞅瞅:

可以看到数据压缩了将近一半多,so GOOD!!!
言归正传:
首先我们
新建一个proto文件,定义基本的数据格式
syntax = "proto2";
option java_outer_classname="PersonProtoBuf";
message Person{
optional int32 id = 1;
optional int32 age = 2;
optional string name= 3;
optional bool is_sex= 4;
}
message Class{
optional int32 grade_num = 1;
optional int32 class_num = 2;
optional Person head_teacher = 3;
repeated Person students = 4[packed=true];
}
* 第一句确定是语法版本
* 其二是指定生成的class
* 还可以指定包名
* 主体:
* message Person{...}
* 主要实体编写区域
* 其中:
* optional:非必需参数
* repeated:可以重复存储一个字段,其中是待顺序的存取
* required:必要参数
*
* 结构体、类,统一定义为 message,实际上是嵌套类
*
* int32,string,bool 数据格式
* 1,2,3,4 表示数据元素的唯一编号
*
*
* 还可以定义:
* enum xx //枚举定义
* {
* XXX = 0;
* ...
* }
*
* struct SS{ //结构体定义
* required int s1;
* required int s2;
* }
*
* 具体需要翻墙查看官网文档: https://developers.google.com/protocol-buffers/docs/javatutorial
* 接下来就需要:使用java程序进行压缩,模拟解压.
这个protoc的工具加不加环境变量随便,使用命令(我这里是加了环境变量):
protoc --java_out=./ ./****.proto文件
其中第一个./是将生成的java文件放在本目录下,其二个则是在找到这个proto文件,
这里还需要编写其proto文件...
执行结果:

我们现在创建java项目,添加protocol 的jar依赖
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.7.0-rc1</version>
</dependency>
基本结构

public class ServiceSchool {
private PClass pClass = null;
/**
* 初始化班级
*/
@Before
public void initClass(){
//设置教师类
Person teacher = new Teacher(1,30,"王老师",false);
//设置学生类 一个班级50人
List<Person> allStudents = new ArrayList<>();
for(int i = 0; i < 50; i++) {
Person student = null;
if(i % 2 == 0) {
student = new Student(i + 1000, (int) (Math.random() * 20), "学生" + i + "号", true);
}else{
student = new Student(i + 1000, (int) (Math.random() * 20), "学生" + i + "号", false);
}
allStudents.add(student);
}
pClass = new PClass(7,3,teacher,allStudents);
}
/**
* 模拟传输的数据字节数组
*/
private byte[] pipeByArray = null;
/**
* 压缩
*/
@Test
public void compression() throws InvalidProtocolBufferException {
// 原数据
System.out.println("原数据的长度: "+pClass.toString().length());
//压缩后
School.Class.Builder pClassCom = setBuilder(pClass);
School.Class build = pClassCom.build();
pipeByArray = build.toByteArray();
System.out.println("压缩后数据长度:"+pipeByArray.length);
}
/**
* 模拟解压
*/
@After
public void decompression() throws InvalidProtocolBufferException {
School.Class.Builder aClass = School.Class.parseFrom(pipeByArray).toBuilder();
//// 解压
int classNum = aClass.getClassNum();
int gradeNum = aClass.getGradeNum();
School.Person headTeacher = aClass.getHeadTeacher();
List<School.Person> studentsList = aClass.getStudentsList();
System.out.println("教师:"+headTeacher.getId()
+headTeacher.getName()
+headTeacher.getAge()
+headTeacher.getIsSex());
for(School.Person p : studentsList){
System.out.println(p.getName()+"-"+p.getId()+"-"+p.getIsSex()+"-"+p.getAge());
}
}
/**
* 添加数据
*
* @param pClass
* @return
*/
private School.Class.Builder setBuilder(PClass pClass){
School.Person.Builder person = School.Person.newBuilder();
//教师类
Person headTeacher = pClass.getHeadTeacher();
//添加教师类
person.setName(headTeacher.getName());
person.setAge(headTeacher.getAge());
person.setIsSex(headTeacher.isSex());
person.setId(headTeacher.getId());
//教室类
School.Class.Builder sClass = School.Class.newBuilder();
sClass.setGradeNum(pClass.getGradeNum());
sClass.setClassNum(pClass.getClassNum());
sClass.setHeadTeacher(person);
//遍历学生
for(int i = 0; i < pClass.getStudents().size();i++){
Person p = pClass.getStudents().get(i);
person.setName(p.getName());
person.setAge(p.getAge());
person.setIsSex(p.isSex());
person.setId(p.getId());
sClass.addStudents(i,person);
}
return sClass;
}
}
发现其中数据量越少,压缩后会更小基本上都是1/3原来的体积,下一次准备使用这个协议做rpc了,哈哈
参考网站:
https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/
https://worktile.com/tech/share/prototol-buffers
Protocol Buffer序列化/反序列化---初体验(java版)的更多相关文章
- Protocol Buffer序列化Java框架-Protostuff
了解Protocol Buffer 首先要知道什么是Protocol Buffer,在编程过程中,当涉及数据交换时,我们往往需要将对象进行序列化然后再传输.常见的序列化的格式有JSON,XML等,这些 ...
- Protocol Buffer 序列化原理大揭秘 - 为什么Protocol Buffer性能这么好?
前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存 ...
- Protocol buffer序列化及其在微信蓝牙协议中的应用
Protocol buffer是Google出品的一种轻便高效的结构化数据存储格式,可对结构化数据进行序列化,并具有语言无关.平台无关等特点,在通信协议和数据存储等领域已经得到广泛的应用.目前其已经提 ...
- Protocol Buffer序列化对比Java序列化.
初识 Protocol Buff是谷歌推出的一种序列化协议. 而Java序列化协议也是一种协议. 两者的目的是, 将对象序列化成字节数组, 或者说是二进制数据, 那么他们之间有什么差异呢. proto ...
- DRF框架之序列化器初体验
首先,我们需要明白序列化和反序列化的过程指的是什么. 序列化操作:将模型数据 ---> 字典数据 --->JSON数据(响应JSON数据的操作) 反序列化操作:将JSON数据 ---> ...
- 三分钟:极速体验JAVA版目标检测(YOLO4)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Android:Google出品的序列化神器Protocol Buffer使用攻略
习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存储格式 ...
- Protocol Buffer技术
转载自http://www.cnblogs.com/stephen-liu74/archive/2013/01/02/2841485.html 该系列Blog的内容主体主要源自于Protocol Bu ...
- 快来看看Google出品的Protocol Buffer,别只会用Json和XML了
前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存 ...
随机推荐
- 报文分析6、ARP报头结构
ARP报头结构 硬件类型 协议类型 硬件地址长度 协议长度 操作类型 发送方的硬件地址(0-3字节) 源物理地址(4-5字节) 源IP地址(0-1字节) 源IP地址(2-3字节) 目标硬件地址(0 ...
- js 获取某个某个区间内的随机整数
//获取某个某个区间内的随机整数 ,获取到的值域为[min,max)function get_random_num(min,max){ if(/^-?\d+$/.test(min) && ...
- 刷榜中ASO优化中下载量与评论之间的对应比
刷榜中ASO优化中下载量与评论之间是怎么样对应,我们都知道,在ASO优化的过程中,ASO优化师在做下载量后的二至三天,都会顺带着做一下评论.这时候问题就来了,下载量与评论的比例关系应该如何确定呢?最近 ...
- 一个人工智能教程,教案接地气、限制级。 http://www.captainbed.net
一个人工智能教程,教案接地气.限制级. http://www.captainbed.net https://open.weibo.com/
- tableview Footerview有多余的间距
调整footerView的高度 UIView *footerV = [[UIView alloc] initWithFrame:CGRectMake(, , Main_Screen_Width, )] ...
- mysql授权用户,撤销用户,撤销权限基本操作
进入mysql库 use mysql; mysql> select host,user from user; +-----------+---------------+ | host | use ...
- Servlet服务器、客户端跳转
服务期跳转.服务器端转发.服务器端重定向是一个意思使用“req.getRequestDispatcher(“跳转路径”).forward(req,resp)”实现服务器端转发 客户端发送请求后数据传输 ...
- MVC5+EF6 完整教程17--升级到EFCore2.0(转)
MVC5+EF6 完整教程17--升级到EFCore2.0 2017年08月22日 14:48:12 linux12a 阅读数:2814 EF Core 2.0上周已经发布了,我们也升级到core ...
- Kinetis Design Studio 下使用J-Link下载程序
1.安装J-Link驱动. 在KDS安装目录下已自带J-Link驱动,进入以下目录(以我的为例): C:\Freescale\KDS_1.1.1\segger\USBDriver 将看到CDC.x64 ...
- object tracking 词汇积累
1. off-the-shelf adj. 现成的:常备的:成品的 adv. 现成地:无需作重大修改地 commercial off-the-shelf商用现货商规成品商业货架产品供应 off-the ...