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());
}
}
來驗證結果。