2015-04-30 30 views
6

我目前正在玩Google Protocol Buffers的v3.0.0-alpha-2。Protocol Buffers(protobuf)v3.0.0-alpha-2中的可選字段和約束

據我所知,v3刪除了required關鍵字,extensions 關鍵字和字段的默認值,以簡化原語言。

什麼我明白是在proto3 optional關鍵字的含義。

例子:

syntax = "proto3"; 

package fw.example; 

message ExampleMessage { 
    optional string optional_string = 1; 
    string normal_string = 2; 
} 

問題:是什麼optional_stringnormal_string 除了名稱和標籤之間的區別?

我已經閱讀下面的資源(他們似乎是唯一公開 產品尚未推出了的protobuf的V3):

但他們並不甚至提到了optional關鍵字。

  • optional在proto3中已經過時了,因爲字段總是可選的嗎?
  • 如果required消失,如何使用proto3強制執行必填字段?

似乎在proto3中,人們不能再區分未設置的字段和由客戶端設置的(隱式)默認值的 字段。

將每個proto3消息包裝在特定於語言的類中是否是最佳做法? 我正在使用C++,我需要確保設置了特定的字段。看起來 驗證必須現在在特定於語言的源代碼中手動完成,在 與proto2對比。

有人能夠啓發我,對原始消息應用約束的最佳方法是什麼,但允許方案進化?目前,我認爲必須圍繞proto3消息編寫新的API ,以便客戶端不直接使用proto3生成的代碼直接處理 ,而是使用自定義API代碼。那 是否正確?

也許有人可以給我一個具體的例子來討論。

我很困惑,因爲下面是V3的發行說明中指出:

我們建議新的Protocol Buffers的用戶使用proto3。但是,我們不推薦 由於 API不兼容而推薦現有用戶從proto3遷移到proto3,並且我們將繼續長期支持proto2。

如果proto3是要走的路,爲什麼事情複雜?在我看來,我現在需要編寫比proto2更多的代碼。

+0

如果你的代碼是用於生產用途的,我認爲我會堅持版本2,直到所有的錯誤和文檔錯誤已被解決 –

+0

@RichardHodges,但proto3的json序列化是Oooh-So-sweet! – drozzy

回答

6

我的理由如下:

由於required是過時了,那麼一切都是optional。因此沒有明確的關鍵字的理由。

language guide以下段落表明,如果沒有設置值是如何初始化:

注意,對於標消息字段,一旦消息被分析有 沒有告訴字段是否被明確設置爲方式默認值 值(例如布爾值是否設置爲false)或者根本沒有設置 :在定義消息類型時應該記住這一點。

所以optional真的意思是「如果您沒有明確設置它,我們會將它設置爲默認值!」

注意,這讓他們做一些很好的優化(如果它設置爲默認不包括電線上的值):

例如,沒有這樣的一些行爲,當切換一個布爾 設置爲false,如果您不希望該行爲也發生在 默認值。另請注意,如果標量消息字段默認設置爲 ,則該值不會在連線上序列化。

+2

在生成的代碼中丟失「has_XXX」方法似乎向後退了一大步。儘管有上述建議,但嘗試組織服務接口以使其可行是不現實的。我發現自己在考慮嵌入消息(支持「有」),或者客戶端可以提出所有默認請求的尷尬交互,然後選擇「櫻桃選擇」覆蓋。 – Jeff

4

proto3 documentation(「使用proto2消息類型」一節)指出,您可以使用'import'關鍵字導入proto2 .proto文件,反之亦然。這意味着v2和v3 .proto語法是兼容的,這意味着可選和必需的仍然受支持。

我說給它一個去看看會發生什麼。

相關問題