码迷,mamicode.com
首页 > 其他好文 > 详细

Google ProtocolBuffer(PB) 简介和实例

时间:2015-04-07 13:58:31      阅读:542      评论:0      收藏:0      [点我收藏+]

标签:googlepb   数据交换格式   java   

简介

  • ProtocolBuffer(PB) 是一种轻便高效的结构化数据存储格式,可以用于结构化数据的序列化。
  • 类似xml和json,但PB比前两者更高效和省空间,在移动开发中更为用户省流量。
  • PB如何做到更省流量的? 这得从它的编码方式来看,PB采用Zigzag 编码并充分利用Varint技术,从而实现二级制级的空间节省。

实例

  • 步骤一, 书写 .proto 文件,这里直接上google官方实例,并存储为addressbook.proto
package tutorial;

option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";

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 AddressBook {
  repeated Person person = 1;
}
  • 步骤二,编译 .proto 文件,用到PB配套的编译工具protoc,并生成java类
protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto
protoc -I=. --java_out=. addressbook.proto
  • 步骤三,应用生成的类,并做序列化和反序列化操作,依赖库protobuf-java-2.6.1.jar(且版本必须和上一步的protoc的版本一致)
//生成对象
        Person john =
                  Person.newBuilder()
                    .setId(1234)
                    .setName("John Doe")
                    .setEmail("jdoe@example.com")
                    .addPhone(
                      Person.PhoneNumber.newBuilder()
                        .setNumber("555-4321")
                        .setType(Person.PhoneType.HOME))
                    .build();


        System.out.println(john.toString());

//序列化为二进制数组
byte[] johnbyte = john.toByteArray();

//反序列化(中间过程你可以认为是经过了网络传输,文件存储等)
//注意对比两个System.out的输出
        try {
            Person john2 = Person.parseFrom(johnbyte);
            System.out.println(john2.toString());
        } catch (InvalidProtocolBufferException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

扩展

  • 书写 .proto的细节
  • PB编码的算法
  • 基于PB协议升级注意事项等

下载

  • 下列地址提供了上述实例工程的完整下载,资源包含: protobuf-2.6.1.zip源码; protoc-2.6.1-win32; protobuf-java-2.6.1.jar; 一个序列化反序列化实例
  • 下载传送门

参考

Google ProtocolBuffer(PB) 简介和实例

标签:googlepb   数据交换格式   java   

原文地址:http://blog.csdn.net/cheyiliu/article/details/44918403

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!