一、Protobuf3編碼規則
Protobuf3採用的是二進位編碼,它對數據進行了壓縮並使數據更加緊湊。每個欄位都擁有自己的唯一標識符、數據類型和標識位。使用不同的標識位可以標識出不同的數據類型,例如:WireType.Varint(變長整型)、WireType.Fixed32、WireType.Fixed64等。
在序列化的時候,Protobuf將會按照定義的順序依次寫入每一個欄位的數據。在反序列化的時候,Protobuf將會按照定義的順序依次讀取每一個欄位的數據,並根據欄位的標識位和數據類型將其解析出來。
下面是一個使用Protobuf3編碼規則進行編碼的示例代碼:
syntax = "proto3";
message Person {
int32 id = 1;
string name = 2;
bool is_active = 3;
}二、Protobuf3不能設默認值
在 Protobuf 3 中,欄位不能再有默認值了,如果不設置欄位內容就不會序列化這個欄位
默認值的設定方式是在 message 中的欄位定義的時候通過 [default = 默認值] 來設置。
下面是一個無法設置默認值的示例代碼:
syntax = "proto3";
message Person {
int32 id;
string name;
bool is_active;
}三、Protobuf3的JSON序列化
在 Protobuf 3 中提供了對 JSON 格式的支持,這使得 Protobuf 便於在 Web 開發中使用。
對於 Protobuf 消息的 JSON 編碼,其所有整數類型皆作為數字類型編碼,不會自動轉換成字元串編碼。
下面是一個將 Protobuf3 消息序列化為 JSON 格式的示例代碼:
syntax = "proto3";
message Person {
int32 id = 1;
string name = 2;
bool is_active = 3;
}
Person person = Person.newBuilder()
.setId(1)
.setName("John")
.setIsActive(true)
.build();
JsonFormat.Printer printer = JsonFormat.printer().includingDefaultValueFields();
String json = printer.print(person);
System.out.println(json);四、Protobuf3的嵌套消息
在 Protobuf 3 中,可以在 message 中嵌套 message,這使得 Protobuf 支持更加複雜的數據結構。
下面是一個示例代碼,定義了一個嵌套的 Address message:
syntax = "proto3";
message Address {
string country = 1;
string city = 2;
string street = 3;
}
message Person {
int32 id = 1;
string name = 2;
bool is_active = 3;
Address address = 4;
}
Person person = Person.newBuilder()
.setId(1)
.setName("John")
.setIsActive(true)
.setAddress(Address.newBuilder()
.setCountry("USA")
.setCity("San Francisco")
.setStreet("Mission St.")
.build())
.build();原創文章,作者:XFPQ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/134365.html
微信掃一掃
支付寶掃一掃