Google Protobuf Java API详解

来源:互联网 发布:安卓软件破解 编辑:程序博客网 时间:2024/06/05 10:15

1.依赖

想要正常的使用生成的Java类,需要导入protobuf的依赖:protobuf-java.jar

2.protobuf Java API

以GPS信号为例,Gps.proto文件如下:
syntax = "proto2";option java_package = "com.test.bean";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 phones = 4;}message AddressBook {  repeated Person people = 1;}

(1)Builders
使用Protobuf生成的每一个java类中,都会包含两种内部类:Msg和Msg包含的Builder。
以上面的GPS信号为例,
AddressBookProtos.AddressBook、AddressBookProtos.Person、AddressBookProtos.Person.PhoneNumber
AddressBookProtos.AddressBook.Builder、AddressBookProtos.Person.Builder、AddressBookProtos.Person.PhoneNumber.Builder

这两个类提供不同的API,具体来说:
Buider提供了构建类,查询类的API(set、get、has、clear等方法)
Msg提供了查询、序列化的API。

public class Main {    public static void main(String[] args) {        //使用builder构建一个Person对象        AddressBookProtos.Person john =                AddressBookProtos.Person.newBuilder()                        .setId(1234)                        .setName("John Doe")                        .setEmail("jdoe@example.com")                        .addPhones(                                //内部类PhoneNumber同样使用其Builder构建,但是注意,不需要调用build()方法                                AddressBookProtos.Person.PhoneNumber.newBuilder()                                        .setNumber("555-4321")                                        .setType(AddressBookProtos.Person.PhoneType.HOME))                        //build()结束整个程序流,返回Person对象                        .build();        System.out.println(john);    }}

//Msg只提供了get和has方法String email = john.getEmail();boolean hasEmail = john.hasEmail();//而builder提供了add/set、get、has和clear方法AddressBookProtos.Person.Builder builder = AddressBookProtos.Person.newBuilder();builder.setEmail("jdoe@example.com");boolean hasEmail1 = builder.hasEmail();String email1 = builder.getEmail();builder.clearEmail();


序列化:
  • byte[] toBytesArray():生成字节数组
  • void writeTo(OutputStresam output) :序列化并写入到指定的输出流中
反序列化:
  • static Person parseFrom(byte[] data):解析二进制数组,反序列化指定对象
  • static Person parseFrom(InputStream input):解析输入流,反序列化指出指定对象
public class Main {    public static void main(String[] args) {        //使用builder()Msg类        AddressBookProtos.Person john =                AddressBookProtos.Person.newBuilder()                        .setId(1234)                        .setName("John Doe")                        .setEmail("jdoe@example.com")                        .addPhones(                                AddressBookProtos.Person.PhoneNumber.newBuilder()                                        .setNumber("555-4321")                                        .setType(AddressBookProtos.Person.PhoneType.HOME))                        .build();        try {            //序列化            byte[] bytes = john.toByteArray();            //反序列化            System.out.println(AddressBookProtos.Person.parseFrom(bytes));        } catch (InvalidProtocolBufferException e) {            e.printStackTrace();        }    }}



原创粉丝点击