天天看點

Google Protobuf Java 實體List 與 實體 差別Protobuf 用途很廣,是一種壓縮格式的序列化工具技術元件。

Protobuf 用途很廣,是一種壓縮格式的序列化工具技術元件。

但是在使用過程中會遇到很多問題,比如 java的 序列類如何生成,等等。類型不存在怎麼辦,等等。

首先對其進行安裝

官網位址:https://github.com/protocolbuffers/protobuf/releases

可以下載下傳 帶有java 語言字樣的 案例包 進行檢視。

Google Protobuf Java 實體List 與 實體 差別Protobuf 用途很廣,是一種壓縮格式的序列化工具技術元件。

解壓後如圖所示: 

Google Protobuf Java 實體List 與 實體 差別Protobuf 用途很廣,是一種壓縮格式的序列化工具技術元件。

把bin檔案路徑加入 系統環境變量裡

Google Protobuf Java 實體List 與 實體 差別Protobuf 用途很廣,是一種壓縮格式的序列化工具技術元件。

然後通過指令:  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());
      }
    }
           

來驗證結果。