简而言之,有没有办法定义一个包含另一个任意类型的消息的protobuf消息?就像是:
message OuterMsg {
required int32 type = 1;
required Message nestedMsg = 2; //Any sort of message can go here
}
Run Code Online (Sandbox Code Playgroud)
我怀疑有一种方法可以做到这一点,因为在各种protobuf实现中,编译的消息从一个公共Message基类扩展.
否则我想我必须为各种类型的消息创建一个公共基本消息,如下所示:
message BaseNestedMessage {
extensions 1 to max;
}
Run Code Online (Sandbox Code Playgroud)
然后呢
message OuterMessage {
required int32 type = 1;
required BaseNestedMessage nestedMsg = 2;
}
Run Code Online (Sandbox Code Playgroud)
这是实现这一目标的唯一途径吗?
最常用的方法是为每种消息类型创建可选字段:
message UnionMessage
{
optional MsgType1 msg1 = 1;
optional MsgType2 msg2 = 2;
optional MsgType3 msg3 = 3;
}
Run Code Online (Sandbox Code Playgroud)
Google官方文档中也介绍了此技术,并且在各种实施方案中都得到了很好的支持:https: //developers.google.com/protocol-buffers/docs/techniques#union
基本上不是直接的; 协议缓冲区非常希望事先知道结构,并且消息的类型不包含在线路上.公共Message基类是用于提供常见管道代码的实现细节 - 协议缓冲区规范不包括继承.
因此,选择有限:
bytes类型包含,并传达"这是什么?" 信息分开(大概是鉴别器/枚举)我还应该注意,一些实现可能会为此提供更多支持; protobuf-net(C#/ .NET)支持(单独)继承和动态消息类型(即上面的内容),但主要仅用于从一个库到那个库.因为这是规范之外的所有内容(在线路格式方面保持100%有效),所以从其他实现中解释这些数据可能是不必要的混乱.
| 归档时间: |
|
| 查看次数: |
9221 次 |
| 最近记录: |