Java-protocbuf

window系统下的操作:

1.准备两个文件proto.exe,protobuf-java-2.5.0.jar。

如果是protobuf-2.5.0.zip,将其解压缩后,用VS2010打开其中的vsprojects工程,编译后,将proto.exe拷贝待用。

2.建立一个Java工程test-protocbuf

将proto.exe拷贝至test-protocbuf下;

工程下建立proto文件夹,用来存放xxx.proto文件;

编写规范的proto文件兵存储至proto文件夹下;

生成Java文件,使用cmd命令编译这个proto文件:

在protc.exe目录下执行protoc--version可查看protoc版本;

在protc.exe目录下执行protoc --java_out=./src ./proto/xxx.proto;

在指定目录下将生成一个Java文件,将其引入到MyEclipse中;

再把protobuf-java-2.5.0.jar引入到工程libs目录中;

例:编写msg.proto文件

为需要序列化的数据接口加入一个message属性,为每一个字段指定名称和类型。注意message 的名称不能与java_outer_classname 名称相同,不然编译不过。

4.进行测试

[java]view plaincopy

importjava.util.List;

importcom.google.protobuf.InvalidProtocolBufferException;

importcom.protobuftest.protobuf.PersonProbuf;

importcom.protobuftest.protobuf.PersonProbuf.Person;

importcom.protobuftest.protobuf.PersonProbuf.Person.PhoneNumber;

publicclassTestPb {

/**

* @param args

*/

publicstaticvoidmain(String[] args) {

// TODO Auto-generated method stub

PersonProbuf.Person.Builder builder = PersonProbuf.Person.newBuilder();

builder.setEmail("kkk@sogou-inc.com");

builder.setId(1);

builder.setName("TestName");

builder.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().setNumber("13214123").setType(PersonProbuf.Person.PhoneType.MOBILE));

builder.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().setNumber("023412341").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

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);

}

}

*******************************

生成java文件:PersonProbuf.java

*******************************

工程文件结构:

【什么是pb】

全称是Protocol Buffers,是Google内部用的一种高效的、可扩展的对结构化数据进行编码的格式规范,Google内部很多程序间的通信协议都用了protobuf。是用于结构化数据串行化的灵活、高效、自动的方法,有如XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。

用于序列和反序列所有基于Google Protobuf格式的各种消息。 能够将protobuf格式还原成XML、JSON和HTML等文本格式。

将对象转成二进制数据进行传输,缺点是可读性差,但是占用空间小,有时候采用protobuf来摒弃传统的XML传输数据。

google官方连接地址http://code.google.com/p/protobuf/downloads/list

备注:限定修饰符 required ,optional ,repeated

【摘录】

一条消息数据,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一,总体看来ProtoBuf的优势还是很明显的

protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,详情访问protobuf的google官方网站

protobuf在google中是一个比较核心的基础库,作为分布式运算涉及到大量的不同业务消息的传递,如何高效简洁的表示、操作这些业务消息在google这样的大规模应用中是至关重要的。而protobuf这样的库正好是在效率、数据大小、易用性之间取得了很好的平衡。

protobuf简单总结如下几点:

1 灵活(方便接口更新)、高效(效率经过google的优化,传输效率比普通的XML等高很多);

2 易于使用;开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持java、c++、python等语言环境。通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作。

3 多语言支持;原生支持c++,java,python

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180321B0ZS0G00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券