在您發布使用Protocol Buffer區的代碼后,您遲早會因為業務需求變更想要“改進”Protocol Buffer的定義。如果你想讓你的新Protocol Buffer向后兼容,讓你的舊Protocol Buffer向前兼容,那么你需要遵守一些規則。在新版本的Protocol Buffer中:
-
您不能更改任何現有字段的標簽號。
-
您不得添加或刪除任何必填字段。
-
您可以刪除可選或重復的字段。
-
您可以添加新的可選或重復字段,但必須使用新的標簽號(即,從未在此Protocol Buffer中使用過的標簽號,甚至未被刪除的字段使用過)。
- 當有需要可以在生成的Java類中進行修改
(這些規則有一些例外,但很少使用。)
如果您遵循這些規則,舊代碼將無縫兼容新消息,並忽略掉新字段。對於舊代碼,被刪除的可選字段將只具有它們的默認值,被刪除的重復字段將為空。新代碼也會透明地讀取舊消息。但是,請記住,新的可選字段不會出現在舊消息中,因此您需要顯式檢查它們是否設置了has_,或者在您的.proto文件中提供一個合理的默認值,在標簽號后面加上[default = value]。如果沒有為可選元素指定默認值,則使用特定於類型的默認值:對於字符串,默認值為空字符串。對於布爾值,默認值為false。對於數值類型,默認值為零。還要注意,如果您添加了一個新的重復字段,您的新代碼將無法判斷它是空的(由新代碼)還是根本沒有設置(由舊代碼),因為它沒有has_ 標記。
高級用法
Protocol buffer的使用超越了簡單的訪問器和序列化。請務必瀏覽一下Java應用編程接口參考,看看您還可以用它們做些什么。
協議消息類提供的一個關鍵特性是反射。您可以迭代消息的字段和擺布它們的值,而無需針對任何特定的消息類型編寫代碼。使用反射的一個非常有用的方法是將協議消息轉換成其他編碼,如XML或JSON。反射的一個更高級的用途可能是發現相同類型的兩個消息之間的差異,或者開發一種“協議消息的正則表達式”,在這種表達式中,您可以編寫與某些消息內容匹配的表達式。如果你運用你的想象力,就有可能將Protocol Buffers應用到比你最初預期的更廣泛的問題上!
反射是作為消息和Message.Builder接口的一部分提供的。
