一、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-hant/n/134365.html