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