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出品的一种轻量 & 高效的结构化数据存 ...
随机推荐
- docker上配置mysql主从复制
1.在docker上启动2台mysql容器:(这里3306为主,3307为从) docker run -d -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 - ...
- ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
约束字段为自动增长,被约束的字段必须同时被key约束 没有设置成primary key 时,会报错. 加上primary key 则设置成功.
- [dev]typeof, offsetof 和container_of
转一篇文章.写的比较好,浅显易懂,还画了图. https://www.cnblogs.com/idorax/p/6796897.html 概况一下: container_of用到了typeof和off ...
- oracle解决导入高版本dmp报错问题:IMP-00058: ORACLE error 12547 encountered
低版本oracle导入高版本的dmp时,导过的人都应该清楚,直接导入是会报错的,报错信息如下,其实解决这个问题很简单, 只要修改一下dmp内的版本号就可以了. 修改版本不能随便使用文本工具打开,否知会 ...
- 【Python全栈-CSS】CSS实现网页背景图片自适应全屏
CSS实现网页背景图片自适应全屏 功能:实现能自适应屏幕大小又不会变形的背景大图,而且背景图片不会随着滚动条滚动而滚动. 以下是用CSS实现的方法: <html> <head> ...
- Linux(CentOs 7)系统重装笔记(二)---完全删除用户账号和root用户登录
参考网址:https://jingyan.baidu.com/article/046a7b3ede1c38f9c27fa91b.html 一.完全删除用户 1.查看要删除的用户账号信息 find / ...
- TZOJ 5271: 质因数的个数
求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3*5,共有5个质因数. 输入 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N< ...
- [js]d3.js绘制拓扑树
echart也支持拓扑树了 所需的json数据格式: children嵌套 vis.js也支持绘制拓扑树 数据格式: nodes: {id, label, title} edges: {from, t ...
- Windows 系统快速查看文件MD5
关键 ·打开命令窗口(Win+R),然后输入cmd ·输入命令certutil -hashfile 文件绝对路径 MD5 快速获取文件绝对路径 ·找到文件,右键属性 注意 ·在Win7上,MD5不要使 ...
- ZY
2017*****1022:我是石翟夫:我的爱好是计算机: 我的码云个人主页是:https://gitee.com/S_DiF/events 我的第一个项目地址是:https://gitee.com/ ...