八.Protobuf3更新消息類型(添加新的字段)


Protobuf3 更新消息類型

  如果現有的消息類型不滿足你的所有需求——例如,你希望消息格式有一個額外的字段——但是你仍然希望使用用舊格式創建的代碼,別擔心!在不破壞任何現有代碼的情況下更新消息類型非常簡單。請記住以下規則:

  不要更改任何現有字段的字段編號。

  如果添加新字段,任何使用“舊”消息格式由代碼序列化的消息仍然可以被新生成的代碼解析。您應該記住這些元素的默認值,以便新代碼可以與舊代碼生成的消息能夠正確交互。同樣,新代碼創建的消息可以被舊代碼解析:舊二進制文件在解析時忽略新字段。

未知字段是格式良好的協議緩沖區序列化數據,用於表示解析器無法識別的字段。例如,當舊二進制解析新二進制發送的帶有新字段的數據時,這些新字段將成為舊二進制中未知的字段。

  最初,proto3消息在解析過程中總是丟棄未知字段,但是在3.5版中,我們重新引入了未知字段的保留以匹配proto2行為。在3.5及更高版本中,未知字段會在解析期間保留,並包含在序列化輸出中。

  只要更新的消息類型中不再使用字段號,就可以刪除字段。您可能希望重命名該字段,也許添加前綴 "OBSOLETE_",或者保留字段號,以便將來你.proto不會意外地被其他用戶重復使用。

  int32, uint32, int64, uint64和bool都是兼容的——這意味着您可以將字段從這些類型中的一種更改為另一種類型,而不破壞向前或向后兼容性。如果從不適合相應類型中的字段中解析出一個數字,你將會得到與用c++將該數字轉換為該類型相同的效果(例如,如果int64數字被解析為int32,它將被截斷為32位)。

  sint32 和sint64 彼此兼容,但與其他整數類型不兼容。只要字節是有效的UTF - 8,字符串和字節是兼容的。

如果字節包含消息的編碼版本,則嵌入消息與字節兼容。

  fixed32與sfixed32兼容, fixed64與sfixed64兼容。

  enum與int32、uint32、int64和uint64在電線格式條款兼容(請注意,如果這些值不匹配,它們將被截斷)。然而,請注意,當消息被反序列化時,客戶端代碼可能會以不同的方式對待它們:例如,無法識別的proto3枚舉類型將保留在消息中,但是當消息被反序列化時,這是如何表示的取決於語言,int字段總是保留其值。

  將單個值更改為新值的成員是安全的,並且是二進制兼容的。如果您確定沒有代碼一次設置多個字段,將多個字段移動到新的字段可能是安全的,將任何字段移動到現有字段中是不安全的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM