protobuf 安装 及 小测试
参考:http://shift-alt-ctrl.iteye.com/blog/2210885
版本: 2.5.0
百度云盘上有jar包。
mac 上安装:
新建:/Users/zj/software/Tools/protobuf目录(此为安装目录)
进入解压目录。
./configure --prefix=/Users/zj/software/Tools/protobuf
make
make install
修改环境变量
在/etc/profile中加:
export PROTOBUF=/Users/zj/software/Tools/protobuf
export PATH=$PROTOBUF/bin:$PATH
测试是否安装完成:
protoc --version
新建测试文件:在/Users/zj/software/Tools/protobuf/mytest 中新建 person.proto
vim:
option java_package = "com.test.protobuf";
option java_outer_classname="PersonProtos";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
在/Users/zj/software/Tools/protobuf/mytest 执行:protoc --java_out=./ person.proto
将生成的目录拷贝到java工程,目录结构按自己的proto中设置即可。
导入protobuf的maven路径:
- <dependency>
- <groupId>com.google.protobuf</groupId>
- <artifactId>protobuf-java</artifactId>
- <version>2.5.0</version>
- </dependency>
测试代码:
- PersonProtos.Person.Builder personBuilder = PersonProtos.Person.newBuilder();
- personBuilder.setEmail("test@gmail.com");
- personBuilder.setId(1000);
- PersonProtos.Person.PhoneNumber.Builder phone = PersonProtos.Person.PhoneNumber.newBuilder();
- phone.setNumber("18610000000");
- personBuilder.setName("张三");
- personBuilder.addPhones(phone);
- PersonProtos.Person person = personBuilder.build();
上面,获得到person实例后,我们可以通过如下方式,将person对象序列化、反序列化。
- //第一种方式
- //序列化
- byte[] data = person.toByteArray();//获取字节数组,适用于SOCKET或者保存在磁盘。
- //反序列化
- PersonProtos.Person result = PersonProtos.Person.parseFrom(data);
- System.out.println(result.getEmail());
这种方式,适用于很多场景,Protobuf会根据自己的encoding方式,将JAVA对象序列化成字节数组。同时Protobuf也可以从字节数组中重新decoding,得到Java新的实例。
- //第二种序列化:粘包,将一个或者多个protobuf对象字节写入stream。
- ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- //生成一个由:[字节长度][字节数据]组成的package。特别适合RPC场景
- person.writeDelimitedTo(byteArrayOutputStream);
- //反序列化,从steam中读取一个或者多个protobuf字节对象
- ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
- result = PersonProtos.Person.parseDelimitedFrom(byteArrayInputStream);
- System.out.println(result.getEmail());
- 第二种方式,是RPC调用中、Socket传输时适用,在序列化的字节数组之前,添加一个varint32的数字表示字节数组的长度;那么在反序列化时,可以通过先读取varint,然后再依次读取此长度的字节;这种方式有效的解决了socket传输时如何“拆包”“封包”的问题。在Netty中,适用了同样的技巧。
- //第三种序列化,写入文件或者Socket
- FileOutputStream fileOutputStream = new FileOutputStream(new File("/test.dt"));
- person.writeTo(fileOutputStream);
- fileOutputStream.close();
- FileInputStream fileInputStream = new FileInputStream(new File("/test.dt"));
- result = PersonProtos.Person.parseFrom(fileInputStream);
- System.out.println(result);
- 第三种方式,比较少用。但是比较通用,意思为将序列化的字节数组写入到OutputStream中,具体的拆包工作,交给了高层框架。
protobuf 安装 及 小测试的更多相关文章
- google protobuf安装与使用
google protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.google protobuf是跨语言的,并且自带了一个编译器( ...
- Python的安装及小程序练习
Python 1.Python的安装教程 (1)进入Python官网 (2)双击Python-3.6.4.exe安装程序,勾选Add Python 3.6 to PATH (3)选择自定义安装. (4 ...
- 安装12C小问题及pdb表空间配置
安装12C小问题及pdb表空间配置 一.安装 1.RPM包 #安装12C需要安装的rpm包,官网搜索,做个记录 bc binutils-2.23.52.0.1-12.el7(x86_64) compa ...
- nginx 安装ab小工具方法
nginx 安装ab小工具方法测试工具安装(以centos系统为例)yum -y install httpd-tools 然后测试下ab -V
- Cad 二次开发关于SelectCrossingPolygon和SelectFence返回结果Status为error的小测试
CAD2008的二次开发,有个很奇怪的现象,只要你选择的点集不在当前视图上SelectCrossingPolygon和SelectFence返回结果Status就会为error,所以要获取正确的结果, ...
- Ubuntu安装Fcitx(小企鹅五笔输入法)
安装配置如下: 1. 安装 fcitx sudo apt-get install fcitx 2. 配置默认输入法为 fcitx im-switch -s fcitx // 注意无须加 sudo 3. ...
- Inno Setup技巧[界面]自定义安装向导小图片宽度
原文 blog.sina.com.cn/s/blog_5e3cc2f30100cj7e.html 英文版中安装向导右上角小图片的大小为55×55,汉化版中为55×51.如果图片超过规定的宽度将会被压 ...
- Nginx安装部署与测试
场景:项目需要部署在生产环境中,这些新的工具都需要在生产环境中去实践练习.有时间再部署一套ELK的日志分析系统,这样的系统才算具有一定的应用价值. 1 Nginx安装 用root用户安装,采用源代码编 ...
- ActiveMQ (一):安装启动及测试
1. 预备知识 1.1 JMS JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范.<百科> 1.2 JMX JMX(Java M ...
随机推荐
- iOS - UIDevice
前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIDevice : NSObject @available(iOS 2.0, *) public class UI ...
- spring常用的工具类
spring给我们提供了很多的工具类, 应该在我们的日常工作中很好的利用起来. 它可以大大的减轻我们的平时编写代码的长度. 因我们只想用spring的工具类, 而不想把一个大大的spring工程给引入 ...
- JAVA入门 第五周 1多项式
1 多项式加法(5分) 题目内容: 一个多项式可以表达为x的各次幂与系数乘积的和,比如: 现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出. 程序要处理的 ...
- python一个注意的地方
https://www.zhihu.com/question/25874136 class test: l=[] def init(self): self.l=['1','2','7'] a1=tes ...
- Android设置Activity启动和退出时的动画
业务开发时遇到的一个小特技,要求实现Activity启动时自下向上弹出,退出时自上向下退出. 此处不关注启动和退出时其他Activity的动画效果,实现方法有两种: 1.代码方式,通过Activity ...
- pod JONSKit.h MBProgress.h 找不到头文件,怎么办?
这时你看项目pod部分,多了JSONKit库.好了,第三方库就这么神奇的加进来. 头文件路径 那试试看使用JONSKit.h,在ViewController.m里引用下.找不到头文件,怎么办?还没设置 ...
- linux 后台执行命令
本文主要内容: 1. 设置ctontab文件,并用它来提交作业. 2. 使用at命令来提交作业. 3. 在后台提交作业. 4. 使用nohup命令提交作业. 名词解释: cron 系统调度进程.可以使 ...
- iOS开发 设置状态栏样式
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:NO];
- JavaScript中Cookie的用法
Javascript中Cookie主要存储于客户端的计算机中,用于存放已访问的站点信息,Cookie最大约为4k.以下实例主要用于页面在刷新时保存数据,具体的用法如下所示: <html> ...
- 垂直的seekbar
看下效果: 1 package org.qianyukun.core.views; import android.content.Context; import android.graphics.Ca ...