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路径:

  1. <dependency>
  2. <groupId>com.google.protobuf</groupId>
  3. <artifactId>protobuf-java</artifactId>
  4. <version>2.5.0</version>
  5. </dependency>

测试代码:

  1. PersonProtos.Person.Builder personBuilder = PersonProtos.Person.newBuilder();
  2. personBuilder.setEmail("[email protected]");
  3. personBuilder.setId(1000);
  4. PersonProtos.Person.PhoneNumber.Builder phone = PersonProtos.Person.PhoneNumber.newBuilder();
  5. phone.setNumber("18610000000");
  6. personBuilder.setName("张三");
  7. personBuilder.addPhones(phone);
  8. PersonProtos.Person person = personBuilder.build();

     上面,获得到person实例后,我们可以通过如下方式,将person对象序列化、反序列化。

  1. //第一种方式
  2. //序列化
  3. byte[] data = person.toByteArray();//获取字节数组,适用于SOCKET或者保存在磁盘。
  4. //反序列化
  5. PersonProtos.Person result = PersonProtos.Person.parseFrom(data);
  6. System.out.println(result.getEmail());

     这种方式,适用于很多场景,Protobuf会根据自己的encoding方式,将JAVA对象序列化成字节数组。同时Protobuf也可以从字节数组中重新decoding,得到Java新的实例。

  1. //第二种序列化:粘包,将一个或者多个protobuf对象字节写入stream。
  2. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  3. //生成一个由:[字节长度][字节数据]组成的package。特别适合RPC场景
  4. person.writeDelimitedTo(byteArrayOutputStream);
  5. //反序列化,从steam中读取一个或者多个protobuf字节对象
  6. ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
  7. result = PersonProtos.Person.parseDelimitedFrom(byteArrayInputStream);
  8. System.out.println(result.getEmail());
  9. 第二种方式,是RPC调用中、Socket传输时适用,在序列化的字节数组之前,添加一个varint32的数字表示字节数组的长度;那么在反序列化时,可以通过先读取varint,然后再依次读取此长度的字节;这种方式有效的解决了socket传输时如何“拆包”“封包”的问题。在Netty中,适用了同样的技巧。
  1. //第三种序列化,写入文件或者Socket
  2. FileOutputStream fileOutputStream = new FileOutputStream(new File("/test.dt"));
  3. person.writeTo(fileOutputStream);
  4. fileOutputStream.close();
  5. FileInputStream fileInputStream = new FileInputStream(new File("/test.dt"));
  6. result = PersonProtos.Person.parseFrom(fileInputStream);
  7. System.out.println(result);
  8. 第三种方式,比较少用。但是比较通用,意思为将序列化的字节数组写入到OutputStream中,具体的拆包工作,交给了高层框架。
时间: 2024-07-29 02:44:56

protobuf 安装 及 小测试的相关文章

node安装和小测试

一.下载nodejs文件 首先,我们在浏览器中输入nodejs,在搜索结果中,点击进入nodejs官方网站. 2 进入官网后,点击工具栏上的"DOWNLOADS",进入到各平台版本的下载列表中,然后这里可以选择windows Install于可以选择Windows Binary,然后选择对应的位数,我这这里下载了64位的Windows Install. 3 点击列表中的选项后,会弹出来一个保存文件的窗口,点击"保存文件"按钮,将安装文件保存在相应的目录中. 4 二.

Iperf安装使用及测试专线带宽

Iperf安装使用及测试专线带宽 简介 Iperf是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量.Iperf可以测量最大TCP带宽,具有多种参数和UDP特性. Iperf可以报告带宽,延迟抖动和数据包丢失.利用Iperf这一特性,可以用来测试一些网络设备如路由器,防火墙,交换机等的性能. Iperf软件有多种版本,windows版.linux版.Android版.iphone版.MacOSX版等,最新版本为iperf 3.1.1 Jperf是将iperf命令行图形化的JAVA程

node.js安装及小例子

1.node.js安装:http://www.nodejs.org/download/ 下载msi版本,直接双击安装,默认在c盘programfiles下,可以进行配置. 2.在某路径下建立test.js文件(本人在D:\nod目录下): 代码: 1 var http = require('http'); 2 http.createServer(function (req, res) { 3 res.writeHead(200, {'Content-Type': 'text/plain'});

Python的安装及小程序练习

Python 1.Python的安装教程 (1)进入Python官网 (2)双击Python-3.6.4.exe安装程序,勾选Add Python 3.6 to PATH (3)选择自定义安装. (4)指定安装位置 (5)测试安装. 打开CMD窗口,执行Python命令,输出版本等信息说明安装成功 python作业 小明身高1.75m,体重80.5kg.请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数: 低于18.5:过轻 18.5-25:正常 25-28:过重

struts2 返回页面数据小测试

用户通过查询,后台得到查询数据,那么struts2这么把查询的数据,在页面显示?做个小测试. 创建项目 导入jar包(如果不知道导入哪些jar,参考前面章节)测试jar包为2.5 配置web.xml 写测试 项目结构图 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&qu

Redis安装及简单测试

题目链接:11645 - Bits 题意:给定一个数字n,要求0-n的二进制形式下,连续11的个数. 思路:和 UVA 11038 这题类似,枚举中间,然后处理两边的情况. 不过本题最大的答案会超过longlong,要用高精度,不过借鉴http://www.cnblogs.com/TO-Asia/p/3214706.html这个人的方法,直接用两个数字来保存一个数字,这样能保存到2个longlong的长度,就足够存放这题的答案了. 代码: #include <stdio.h> #include

Hadoop0.21.0部署安装以及mapreduce测试

鉴于hadoop的需要...但是并不限于此...有时候闲输入密码麻烦,也可以用这种办法从一个节点通过ssh进入另一个节点... 设要使master进入slave是免密码的,则可以在master(ip为192.168.169.9)中如下操作: 命令:ssh-keygen -t rsa  然后一路回车(该命令不需要进入特定目录) cd进入/root/.ssh/可以看见如下(橙色是新生成的) id_rsa  id_rsa.pub  known_hosts 然后用scp命令将id_rsa远程传输到sla

[UNet]通过一个小测试了解Command和ClientRpc的功能

作者只是业余时间接触Unity 2个月的新人一枚,如有不对的地方,请各位大神指正! Unity 5.以后使用了新的网络模块UNet(其实我接触的晚压根没用过老的- -!),但是在使用过程中确实关于UNet的资料和讨论挺少的,于是自己做了个小项目测试了Command和ClientRpc两个命令. 首先我们看看官方给出的定义: Commands Commands are sent from player objects on the client to player objects on the s

[Python]threading local 线程局部变量小测试

概念 有个概念叫做线程局部变量,一般我们对多线程中的全局变量都会加锁处理,这种变量是共享变量,每个线程都可以读写变量,为了保持同步我们会做枷锁处理.但是有些变量初始化以后,我们只想让他们在每个线程中一直存在,相当于一个线程内的共享变量,线程之间又是隔离的.python threading模块中就提供了这么一个类,叫做local. 多线程中共享变量和局部变量的区别我画两个小图,简单描述下(作图能力一般,请见谅,概念性的东西大家可以google下,很多好文章) 全局变量 线程局部变量 对比: 下面是