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出品的一种轻量 & 高效的结构化数据存 ...
随机推荐
- linux CentOS
CentOS中由一般用户切换为root用户 1.打开终端,提示符为“$”,表明该用户为普通用户,此时,直接输su,回车,输入root密码,回车,就可以切换到root用户下,此时的提示符变为“#”. 注 ...
- 第二单元电梯调度作业 By Wazaki
figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...
- dddquickly
在项目开发最初的时候,他也有过一段狂欢般的快乐时光,不久之后,事情就越来越艰难. 项目的代码越来越难以维护,工作越来越像是一种煎熬,合作的同事对他越来越不满. “该是与这个项目,与这个公司说 bye ...
- HBase JavaAPI
一.概念 1.对HBase JavaAPI的概述: 01.hbase使用java语言编写,自然支持java编程 02.支持CRUD操作 03.JavaAPI包含了所有的hbase的shell,甚至比这 ...
- 使用Eclipse来操作HDFS的文件
一.常用类 1.Configuration Hadoop配置文件的管理类,该类的对象封装了客户端或者服务器的配置(配置集群时,所有的xml文件根节点都是configuration) 创建一个Confi ...
- linux获取网络信息函数
获取IP地址 int sys_getIP(char *ip_addr) { ] = {"ifconfig eth0 | grep inet | cut -d: -f2 | cut -d' ' ...
- MYSQL 比较集
1.什么是较对集合:字符集的字符比较规则(collation,collate),一个字符集有多个较对集合. mysql> create table ss (id int primary key ...
- HDFS组件性能调优:数据平衡
生产系统中什么情况下会添加一个节点呢? 1 增加存储能力 disk 2 增加计算能力 cpu mem 如果增加是的是存储能力,说明存储已接近饱和或者说过段时间就会没有剩余的空间给作业来用.新加的节点存 ...
- 前端JS插件整理
1.JQuery.js JavaScript 库,简化JS. 官网地址:https://jquery.com/ 菜鸟教程:http://www.runoob.com/jquery/jquery-tut ...
- MVC 使用缓存
public AController() { ViewBag[); } private List<BlogsClass> GetClass(int parentId) { List< ...