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

來驗證結果。

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