2012-05-01 22 views
27

協議緩衝區的一個有吸引力的特性是它允許您擴展消息定義而不會破壞使用舊定義的代碼。在枚舉according to the documentation的情況:如何在協議緩衝區中設計未來的額外枚舉值?

用枚舉類型的字段只能有一組指定的常量,它的價值之一(如果您嘗試提供不同的值,解析器會像對待一個未知字段)

因此,如果您擴展枚舉並使用新值,那麼舊代碼中具有該類型的字段將是未定義的或具有其缺省值(如果有)。

什麼是一個好的策略來處理這個,知道將來enum可能會增加附加值?

想到的一個方法是定義枚舉的「未定義」成員並將其設置爲默認值,然後舊代碼將知道它已發送了無法解釋的內容。這是否合理?是否有更好的方法來處理這種情況?

+0

另一個解決方案是永遠不會將值添加到現有的枚舉中,而是添加一個新的值。 – glennr

+1

從我今天一直盯着的代碼(Java)中,我們不清楚默認值是否有幫助。枚舉字段已經有一個默認值(枚舉的第一個值),但該值被賦值並取消設置。因此,isInitialized()失敗,因爲所需字段的掃描發現hasField布爾值爲false。 枚舉,需要,可擴展 - 挑選任何兩個? – VoiceOfUnreason

+0

@VoiceOfUnreason:正確:如果您製作所需的枚舉,則意外值將被視爲不兼容。有一個默認只有在可選時纔有幫助。 – poolie

回答

18

是的,最好的辦法是使枚舉中的第一個值如UNKNOWN = 0。然後,舊程序讀取一個具有枚舉值的protobuf,它們不會識別它,它會將其視爲UNKNOWN,並希望它們可以合理處理,例如跳過該元素。

如果你想這樣做,你也想讓枚舉爲optional而不是required

required,一般意思是「我寧願程序只是中止處理它不理解的東西。」

請注意,它必須是原始來源中聲明的第一個值 - 只是零值不會使其成爲默認值。