2012-08-30 146 views
6

總之,有沒有一種方法來定義一個protobuf消息,其中包含另一個任意類型的消息?喜歡的東西:Protobuf:嵌套任意類型的消息

message OuterMsg { 
    required int32 type = 1; 
    required Message nestedMsg = 2; //Any sort of message can go here 
} 

我懷疑是有辦法做到這一點,因爲在不同的protobuf的實現,編譯的消息從一個共同Message基礎類擴展。

否則我想我必須創建這樣的各種信息的一個共同的基礎信息:

message BaseNestedMessage { 
    extensions 1 to max; 
} 

,然後做

message OuterMessage { 
    required int32 type = 1; 
    required BaseNestedMessage nestedMsg = 2; 
} 

這是實現這一目標的唯一途徑?

回答

6

不直接,基本上;協議緩衝區非常想要預先知道結構,並且類型的消息不包括在導線上的。常見的Message基類是提供常用管道代碼的實現細節 - 協議緩衝區規範不包括繼承。

有,因此,有限的選擇:每次消息類型

  • 單獨序列化消息,並且

    • 使用不同場號包括它作爲bytes類型,和傳送「這是什麼?」單獨信息(推測鑑別器/枚舉)

    我還應該注意到,一些實施方式可提供此更多的支持; protobuf-net(C#/ .NET)支持(分別)繼承和動態消息類型(即上面的內容),,但是主要僅用於從該庫到該庫。因爲除了規範(根據有線格式保留100%有效)外,這全部是,因此從其他實現中解釋此類數據可能會造成不必要的混亂。

  • +0

    因爲我不能預先知道所有可能的消息,所以我將使用'bytes'字段去單獨的序列化解決方案,謝謝 – DeX3

    1

    除了optional多個字段之外,oneof關鍵字可用於從Protocol Buffers的v2.6開始。

    message UnionMessage { 
        oneof data { 
        string a = 1; 
        bytes b = 2; 
        int32 c = 3; 
        } 
    }