简而言之,有没有办法定义一个包含另一个任意类型的消息的protobuf消息?就像是: message OuterMsg { required int32 type = 1; required Message nestedMsg = 2; //Any sort of message can go here} 我怀疑有一种方法
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; }
这是实现这一目标的唯一途径吗?
基本上不是直接的;协议缓冲区非常希望事先知道结构,并且消息的类型不包含在线路上.公共Message基类是用于提供常见管道代码的实现细节 – 协议缓冲区规范不包括继承.因此,选择有限:
>每个消息类型使用不同的字段编号
>单独序列化消息,并将其作为字节类型包含,并传达“这是什么?”信息分开(大概是鉴别器/枚举)
我还应该注意,一些实现可能会为此提供更多支持; protobuf-net(C#/ .NET)支持(单独)继承和动态消息类型(即上面的内容),但主要仅用于从一个库到那个库.因为这是规范之外的所有内容(在线路格式方面保持100%有效),所以从其他实现中解释这些数据可能是不必要的混乱.