說,我原文件的兩個版本:添加必需的字段新消息的Protobuf V2
新消息1.0版 - 最初版本
2.0版本 - 增加了必需的字段
從兼容性的角度來看,這是否是對原始文件有效的更改?
恕我直言,因爲v2.0
定義了必填字段新的消息,故應引起向後兼容性,因爲如果消息是從v2.0
發送到v1.0
,v1.0
不會理解它,它不知道如何將其解碼。而且由於它被標記爲required
,因此v1.0
甚至不能忽略它。
說,我原文件的兩個版本:添加必需的字段新消息的Protobuf V2
新消息1.0版 - 最初版本
2.0版本 - 增加了必需的字段
從兼容性的角度來看,這是否是對原始文件有效的更改?
恕我直言,因爲v2.0
定義了必填字段新的消息,故應引起向後兼容性,因爲如果消息是從v2.0
發送到v1.0
,v1.0
不會理解它,它不知道如何將其解碼。而且由於它被標記爲required
,因此v1.0
甚至不能忽略它。
將新的必填字段添加到現有的消息類型是向後不兼容的更改,因爲舊服務器不會發送該字段。
向所有字段添加全新的消息類型是向後兼容的,因爲舊服務器根本不會發送該消息。例如,假設我們先從:
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和頭兒原的作者)
協議緩衝區不處理對消息類型的識別。這部分是在應用程序代碼中完成的。
因此,這個問題的答案取決於應用程序在接收到未知消息時的作用。它可能會忽略它或提出錯誤 - 你將不得不檢查代碼才能知道。
感謝您的明確的解釋! – brokenfoot