2014-01-07 69 views

回答

20

你需要做的是這樣的:

message TypeC { 
    optional TypeA a = 1; 
    optional TypeB b = 2; 
} 

如果有很多變種,您可能還需要添加一個標籤字段,這樣你就不必檢查has_*()爲每一個。

這是覆蓋在所述的Protobuf文檔:https://developers.google.com/protocol-buffers/docs/techniques#union

PS。 Protobufs的這個缺失功能​​在Cap'n Proto中修復,這是同一作者(我)的新序列化系統:Cap'n Proto爲此目的實現了"unions"。在離開Goog​​le之前,我還在Protobufs中實施了工會,但是在我離開之前沒有設法讓我的更改合併到主線。抱歉。 :(

編輯:它看起來像Protobuf團隊最終合併我的變化和發佈版本2.6.0與它:)見the oneof declaration

+0

感謝您創造'oneof',你搖滾! – FisherCoder

13

查覈在2.6版本的新oneof功能:https://developers.google.com/protocol-buffers/docs/reference/java-generated#oneof

你現在可以做這樣的事情:

message TypeC { 
    oneof oneof_name { 
     TypeA a = 1; 
     TypeB b = 2; 
    } 
} 

域在同oneof將共享存儲器中,只有一個字段可以設爲同一時間。

+0

如何確認設置了哪一個?我有int,字符串,布爾等,那麼如何確定哪一個被填充? – odiszapc

+0

目前我正在使用下面的測試,但protobuffer可能有更優雅的東西: '!Proto.GetData.getDefaultInstance()。equals(all.getGetData());' – MikeR

+0

另一種方法是做一個開關在執行'all.getMessageCase()'時出現的字符串值 – MikeR