2016-07-05 79 views
0

說,我原文件的兩個版本:添加必需的字段新消息的Protobuf V2

1.0版 - 最初版本
2.0版本 - 增加了必需的字段

新消息

從兼容性的角度來看,這是否是對原始文件有效的更改?

恕我直言,因爲v2.0定義了必填字段新的消息,故應引起向後兼容性,因爲如果消息是從v2.0發送到v1.0v1.0不會理解它,它不知道如何將其解碼。而且由於它被標記爲required,因此v1.0甚至不能忽略它。

回答

2

將新的必填字段添加到現有的消息類型是向後不兼容的更改,因爲舊服務器不會發送該字段。

向所有字段添加全新的消息類型是向後兼容的,因爲舊服務器根本不會發送該消息。例如,假設我們先從:

message Old { 
    required int32 i = 1; 
} 

然後我們加入了新的消息:

message Old { 
    required int32 i = 1; 
    optional New m = 2; 
} 

message New { 
    required string s = 1; 
} 

這是向後兼容的。當一箇舊程序向一個新程序發送消息時,m字段將不存在,這很好,因爲它是可選的。必填字段m.s僅在需要m本身時才需要。

當新程序向舊程序發送消息時,字段m將被忽略。 required並不意味着接收者不能忽略它。 required只意味着發送者需要發送它。

請注意,我強烈建議不要使用required。 Proto3刪除了required,Cap'n Proto從來沒有把它放在第一位,因爲它可能導致意想不到的問題。 Here's an in-depth discussion I wrote.

(披露:我Proto2和頭兒原的作者)

+0

感謝您的明確的解釋! – brokenfoot

0

協議緩衝區不處理對消息類型的識別。這部分是在應用程序代碼中完成的。

因此,這個問題的答案取決於應用程序在接收到未知消息時的作用。它可能會忽略它或提出錯誤 - 你將不得不檢查代碼才能知道。