Google Protobuf Java 实体List 与 实体 区别

Protobuf 用途很广,是一种压缩格式的序列化工具技术组件。

但是在使用过程中会遇到很多问题,比如 java的 序列类如何生成,等等。类型不存在怎么办,等等。

首先对其进行安装

官网地址:https://github.com/protocolbuffers/protobuf/releases

可以下载 带有java 语言字样的 案例包 进行查看。

解压后如图所示: 

 

把bin文件路径加入 系统环境变量里

然后通过命令:  protoc --java_out=. MetaData.proto  来生成 java类

--java_out=.  后面这个. 意思是保存到当前目录 后边是 序列化文件路径。

假设我们有这样一个类

public class Person
{
    string name ;
    int32 id;  // Unique ID number for this person.
    string email;
    List<PhoneNumber> phones;
}
public class PhoneNumber
{
    string number;
    PhoneType type;
}

enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
}
public class AddressBook 
{
  List<Person> persons;
}

主要是person类,然后,想获取它的一个列表。或者是单个类的序列化返回。

那么 其 proto 文件应该是

AddressBook.proto

syntax = "proto3";
option java_outer_classname = "AddressBookProtos";


message Person {
  string name = 1;
  int32 id = 2; 
  string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }

  repeated PhoneNumber phones = 4;

}

message AddressBook {
  repeated Person people = 1;
}

 

package在Java里面代表这个文件所在的包名,在c#里面代表该文件的命名空间,message代表一个类,

message xxx {
  // 字段规则:required -> 字段只能也必须出现 1 次
  // 字段规则:optional -> 字段可出现 0 次或1次
  // 字段规则:repeated -> 字段可出现任意多次(包括 0)
  // 类型:int32、int64、sint32、sint64、string、32-bit ....
  // 字段编号:0 ~ 536870911(除去 19000 到 19999 之间的数字)
  字段规则 类型 名称 = 字段编号;
}

然后,通过命令行生成之后,java引用即可。

代码中可以通过 

 AddressBook addressBook = AddressBook.parseFrom(new FileInputStream(args[0]));
 for (Person person: addressBook.getPeopleList()) {
      System.out.println("Person ID: " + person.getId());
      System.out.println("  Name: " + person.getName());
      if (!person.getEmail().isEmpty()) {
        System.out.println("  E-mail address: " + person.getEmail());
      }

      for (Person.PhoneNumber phoneNumber : person.getPhonesList()) {
        switch (phoneNumber.getType()) {
          case MOBILE:
            System.out.print("  Mobile phone #: ");
            break;
          case HOME:
            System.out.print("  Home phone #: ");
            break;
          case WORK:
            System.out.print("  Work phone #: ");
            break;
          default:
            System.out.println(" Unknown phone #: ");
            break;
        }
        System.out.println(phoneNumber.getNumber());
      }
    }

来验证结果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章