参考: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("test@gmail.com");
  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中,具体的拆包工作,交给了高层框架。

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

  1. google protobuf安装与使用

    google protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.google protobuf是跨语言的,并且自带了一个编译器( ...

  2. Python的安装及小程序练习

    Python 1.Python的安装教程 (1)进入Python官网 (2)双击Python-3.6.4.exe安装程序,勾选Add Python 3.6 to PATH (3)选择自定义安装. (4 ...

  3. 安装12C小问题及pdb表空间配置

    安装12C小问题及pdb表空间配置 一.安装 1.RPM包 #安装12C需要安装的rpm包,官网搜索,做个记录 bc binutils-2.23.52.0.1-12.el7(x86_64) compa ...

  4. nginx 安装ab小工具方法

    nginx 安装ab小工具方法测试工具安装(以centos系统为例)yum -y install httpd-tools 然后测试下ab -V

  5. Cad 二次开发关于SelectCrossingPolygon和SelectFence返回结果Status为error的小测试

    CAD2008的二次开发,有个很奇怪的现象,只要你选择的点集不在当前视图上SelectCrossingPolygon和SelectFence返回结果Status就会为error,所以要获取正确的结果, ...

  6. Ubuntu安装Fcitx(小企鹅五笔输入法)

    安装配置如下: 1. 安装 fcitx sudo apt-get install fcitx 2. 配置默认输入法为 fcitx im-switch -s fcitx // 注意无须加 sudo 3. ...

  7. Inno Setup技巧[界面]自定义安装向导小图片宽度

    原文  blog.sina.com.cn/s/blog_5e3cc2f30100cj7e.html 英文版中安装向导右上角小图片的大小为55×55,汉化版中为55×51.如果图片超过规定的宽度将会被压 ...

  8. Nginx安装部署与测试

    场景:项目需要部署在生产环境中,这些新的工具都需要在生产环境中去实践练习.有时间再部署一套ELK的日志分析系统,这样的系统才算具有一定的应用价值. 1 Nginx安装 用root用户安装,采用源代码编 ...

  9. ActiveMQ (一):安装启动及测试

    1. 预备知识 1.1 JMS JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范.<百科> 1.2 JMX JMX(Java M ...

随机推荐

  1. Java Base64加密、解密原理Java代码

    Java Base64加密.解密原理Java代码 转自:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是 ...

  2. 2013 Multi-University Training Contest 10

    HDU-4698 Counting 题意:给定一个二维平面,其中x取值为1-N,y取值为1-M,现给定K个点,问至少包括K个点中的一个的满足要求的<Xmin, Xmax, Ymin, Ymax& ...

  3. [转载]bigtable 中文版

    转载厦门大学林子雨老师的译文 原文: http://dblab.xmu.edu.cn/post/google-bigtable/ Google Bigtable (中文版) 林子雨2012-05-08 ...

  4. bootstrap学习笔记<九>(菜单,按钮。导航基本元素)

    有了bootstrap作导航不再麻烦,几个样式,几个标签就能轻松搞定. 下面就来分解学习导航条的制作. 一.首先是下拉菜单 <div class="dropdown"> ...

  5. poj1859The Perfect Symmetry

    链接 按x或y排序,假如有对称点的话,头尾相对. #include <iostream> #include<cstdio> #include<cstring> #i ...

  6. mysql 执行计划的理解

    1.执行计划就是在sql语句之前加上explain,使用desc 也可以.2.desc有两个选项extended和partitions,desc extended 将原sql语句进行优化,通过show ...

  7. 【Todo】Java新技术学习笔记-from某技术分析

    看到这篇文章:http://mt.sohu.com/20160806/n462923089.shtml <十余年技术大牛告诉你,这些Java新技术不可错过> 虽然讲的比较泛,但是里面提到的 ...

  8. white-space: nowrap

    CSS:需要加上宽度(width:100px).超出隐藏(overflow:hidden;).强制在同一行显示(white-space: nowrap;).省略号(text-overflow:elli ...

  9. 深入浅出RxJava(一:基础篇)

    RxJava正在Android开发者中变的越来越流行.唯一的问题就是上手不容易,尤其是大部分人之前都是使用命令式编程语言.但是一旦你弄明白了,你就会发现RxJava真是太棒了. 这里仅仅是帮助你了解R ...

  10. 【Linux系统】防暴力破解

    在日志文件/var/log/secure 中可以看到涉及到安全方面的日志,可以查看是否有人尝试暴力破解及是否成功,对于肉鸡行为有一定帮助 思路基本上都是加强密码的复杂度,增加iptables配置黑名单 ...