2012-08-30 97 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; 
        } 
    }