今天闲遐时学习了

Protocol Buffer

在网上看到了许多资料,其中不泛精品,想要详细了解的请看文章结尾的友情链接,我这里就做加深印象,快速入门的一个完整的demo,仅此而已.

学完你可以得到什么:

  1. 可以使用protoc工具序列化类,反序列化类
  2. 基于java语言的对protoc工具的基本使用
  3. 基本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版)的更多相关文章

  1. Protocol Buffer序列化Java框架-Protostuff

    了解Protocol Buffer 首先要知道什么是Protocol Buffer,在编程过程中,当涉及数据交换时,我们往往需要将对象进行序列化然后再传输.常见的序列化的格式有JSON,XML等,这些 ...

  2. Protocol Buffer 序列化原理大揭秘 - 为什么Protocol Buffer性能这么好?

    前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存 ...

  3. Protocol buffer序列化及其在微信蓝牙协议中的应用

    Protocol buffer是Google出品的一种轻便高效的结构化数据存储格式,可对结构化数据进行序列化,并具有语言无关.平台无关等特点,在通信协议和数据存储等领域已经得到广泛的应用.目前其已经提 ...

  4. Protocol Buffer序列化对比Java序列化.

    初识 Protocol Buff是谷歌推出的一种序列化协议. 而Java序列化协议也是一种协议. 两者的目的是, 将对象序列化成字节数组, 或者说是二进制数据, 那么他们之间有什么差异呢. proto ...

  5. DRF框架之序列化器初体验

    首先,我们需要明白序列化和反序列化的过程指的是什么. 序列化操作:将模型数据 ---> 字典数据 --->JSON数据(响应JSON数据的操作) 反序列化操作:将JSON数据 ---> ...

  6. 三分钟:极速体验JAVA版目标检测(YOLO4)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. Android:Google出品的序列化神器Protocol Buffer使用攻略

    习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存储格式 ...

  8. Protocol Buffer技术

    转载自http://www.cnblogs.com/stephen-liu74/archive/2013/01/02/2841485.html 该系列Blog的内容主体主要源自于Protocol Bu ...

  9. 快来看看Google出品的Protocol Buffer,别只会用Json和XML了

    前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存 ...

随机推荐

  1. JAVA的第一次作业

    读后感:这个学期开始接触一门新的学科就是JAVA,老师对这么学科介绍了很多,我也从中了解到了许多,它可能是相对于C语言而已可能要更加方便一些,也是现在世界上所用最多的语音(软件方面),C语言都是排在它 ...

  2. 审核被拒Guideline 2.1 - Information Needed we are unable to find 账号登录 option

    Guideline 2.1 - Information Needed We were unable to sign in to review your app with the demo accoun ...

  3. 对Vuex的初步了解

    文章转载于:http://www.cnblogs.com/wisewrong/p/6344390.html 在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用  props ...

  4. [Unity][安卓]Unity和Android Studio 3.0 交互通讯(1)Android Studio 3.0 设置

    [安卓]Android Studio 3.0 JDK安卓环境配置(2017.10) http://blog.csdn.net/bulademian/article/details/78387052 [ ...

  5. linux touch命令 创建文件

    touch 创建文件,用法,touch test.txt,如果文件存在,则表示修改当前文件时间 [root@MongoDB ~]# touch /data/text.txt [root@MongoDB ...

  6. 学号20175313 《实现Linux下cp XXX1 XXX2的功能(一)》第九周

    目录 MyCP 一.题目要求 二.题目理解 三.需求分析 四.设计思路 五.伪代码分析 六.代码链接 七.代码实现过程中遇到的问题 八.运行结果截图 九.参考资料 MyCP 一.题目要求 编写MyCP ...

  7. 将分支推送到远程存储库时遇到错误: Git failed with a fatal error. TaskCanceledException encountered.

    解决:https://blog.csdn.net/dw33xn/article/details/79951714 修改下配置文件即可

  8. RN启动报错,环境相关问题

    启动RN的时候刚开始报错: The request was denied by service delegate (SBMainWorkspace) for reason: Security (&qu ...

  9. 【LeetCode每天一题】Permutation Sequence(排列序列)

    The set [1,2,3,...,n] contains a total of n! unique permutations.By listing and labeling all of the ...

  10. MFC关于.rc文件 .rc2文件

    .rc文件和.rc2文件 c和rc2都是资源文件,包含了应用程序中用到的所有的资源. 两者不同在于:rc文件中的资源可以直接在VC集成环境中以可视化的方法进行编辑和修改; 而rc2中的资源不能在VC的 ...