google的protocol buffers 对象的序列化 for java
前言:
protobuf确实比JSON快很多倍,看下面的图就知道了。
环境:
win7 x64
eclipse 4.3
protoc-2.5.0
安装包下载:
https://code.google.com/p/protobuf/downloads/list
2.6+的版本已转到GitHub上,下载地址是:
https://github.com/google/protobuf/releases
1.生成jar包
下载ProtoBuf包和生成protobuf-2.5.0.jar文件。下载protoc-2.5.0-win32.zip和protobuf-2.5.0.zip,两个文件都解压缩,将protoc-2.5.0-win32中的protoc.exe文件拷贝到protobuf-2.5.0\src目录下,然后进入protobuf-2.5.0\java,执行 mvn install,编译完成后可以在protobuf-2.5.0\java\target目录中找到protobuf-2.5.0.jar文件。
2.建立eclipse项目
a. protoc.exe 放在工程的根目录下面
b. protobuf-java-2.5.0.jar 放在lib下面
c. 新建一个文件夹proto存放proto文件
d. 在proto文件夹下新建一个文件msg.proto,写入以下内容:
option java_package = "com.jamesfen.protobuf";
option java_outer_classname = "PersonProbuf"; 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; message CountryInfo {
required string name = 1;
required string code = 2;
optional int32 number = 3;
}
} message AddressBook {
repeated Person person = 1;
}
3.产生protobuf JAVA类
进入 cd E:/Git/myhadoop2.x/myhadoop2.x文件夹
执行:
protoc --java_out=./src/main/java ./proto/msg.proto
在包package com.jamesfen.protobuf;下面会找到类PersonProbuf
4.序列化反序列化测试:
package com.jamesfen.protobuf;
import java.util.List;
import com.google.protobuf.InvalidProtocolBufferException;
import com.jamesfen.protobuf.PersonProbuf;
import com.jamesfen.protobuf.PersonProbuf.Person;
import com.jamesfen.protobuf.PersonProbuf.Person.PhoneNumber;
public class TestProtobuf { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
PersonProbuf.Person.Builder builder = PersonProbuf.Person.newBuilder();
builder.setEmail("kkk@email.com");
builder.setId(1);
builder.setName("TestName");
builder.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().setNumber("131111111").setType(PersonProbuf.Person.PhoneType.MOBILE));
builder.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().setNumber("011111").setType(PersonProbuf.Person.PhoneType.HOME));
Person person = builder.build();
byte[] buf = person.toByteArray();
try {
Person person2 = PersonProbuf.Person.parseFrom(buf);
System.out.println(person2.getName() + ", " + person2.getEmail());
List<PhoneNumber> lstPhones = person2.getPhoneList();
for (PhoneNumber phoneNumber : lstPhones) {
System.out.println(phoneNumber.getNumber());
}
} catch (InvalidProtocolBufferException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(buf);
} }
5. 输出:
TestName, kkk@email.com
131111111
011111
[B@472a2a50
6.demo源码下载
https://github.com/Bellonor/myhadoop2.x
版权声明:本文为博主原创文章,未经博主允许不得转载。
google的protocol buffers 对象的序列化 for java的更多相关文章
- MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明
MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明 http://www.open-open.com/lib/view/open1412731170858 ...
- (原)Ubuntu16中卸载并重新安装google的Protocol Buffers
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5782992.html 目前最新的是1.6.1 1. 卸载掉老版本的Protocol: sudo apt ...
- 详解PROTOCOL BUFFERS
1. 前言 Protocal Buffers是google推出的一种序列化协议.由于它的编码和解码的速度,已经编码后的大小控制的较好,因此它常常被用在RPC调用中,传递参数和结果.比如gRPC. Pr ...
- 如何在 PHP 中处理 Protocol Buffers 数据
Protocol Buffers是谷歌定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据量小,解析效率高 ...
- 在centos 6.9下Protocol Buffers数据传输及存储协议的使用(python)
我们知道Protocol Buffers是Google定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据 ...
- Protocol Buffers数据传输及存储协议简单使用
我们知道Protocol Buffers是Google定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据 ...
- Google Protocol Buffers简介
什么是 protocol buffers ? Protocol buffers 是一种灵活.高效的序列化结构数据的自动机制--想想XML,但是它更小,更快,更简单.你只需要把你需要怎样结构化你的数据定 ...
- Protocol Buffers(1):序列化、编译与使用
目录 序列化与反序列化 Protocol Buffers概览 Protocol Buffers C++ 编译 Protocol Buffers C++ 使用 Protocol Buffers的可读性 ...
- Google Protocol Buffers 入门
Google Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化.它很适合做数据存储或 RPC 数据交换格式.可用于通讯协议.数据存储等领域的 ...
随机推荐
- L120 单词造句
The old lady sits on a mobile chair every morning.The book contains scandalous text. The current sur ...
- git教程4-创建分支与删除分支
一.分支的理解 分支,即branch,用于从主分支(master)中新开辟出一个分支,用于对文件进行修改.这部分修改的内容在新的分支未融合到主分支的情况下,主分支是看不见的.新的分支相当于开辟了新的修 ...
- fastCGI模块
这个模块允许nginx同FastCGI协同工作,并且控制哪些参数将被安全传递.例: location / { fastcgi_pass localhost:9000; fastcgi_index in ...
- 微信小程序switch组件尺寸控制
1.修改switch组件的属性值 /* switch */ .wx-switch-input{ width: 82rpx!important; height: 40rpx!important; } / ...
- 5、Selenium+Python自动登录163邮箱发送邮件
1.Selenium实现自动化,需要定位元素,以下查看163邮箱的登录元素 (1)登录(定位到登录框,登录框是一个iframe,如果没有定位到iframe,是无法定位到账号框与密码框) 定位到邮箱框( ...
- laravel 导出导入excel和csv文件的 使用
在项目中用到的常用功能数据导入导出 在laravel有插件可以直接使用 方便快捷 学习源头: https://www.cnblogs.com/martianShu/p/5869270.html htt ...
- SqlServer 用户和权限操作
use [master] GO --创建用户,Test,密码Test CREATE LOGIN [TestUser] WITH PASSWORD=N'Test', DEFAULT_DATABASE=[ ...
- LdapContext获取对象的属性
// dn = "cn=1,cn=Users,DC=域名,DC=COM";// Attributes answer = ctx.getA ...
- mina在spring中的配置多个端口
本次练习中是监听2个端口 applicationContext-mina.xml: <?xml version="1.0" encoding="UTF-8" ...
- Java-API:java.lang百科
ylbtech-Java-API:java.lang百科 java.lang是提供利用 Java 编程语言进行程序设计的基础类.最重要的类是Object(它是类层次结构的根)和 Class(它的实例表 ...