【发布时间】:2015-09-17 21:01:20
【问题描述】:
使用 protobuf,我们可以定义消息并生成它们的类,每个类都知道如何序列化/反序列化为二进制。
假设我们已经定义了多个不同的消息, 我们得到了一些字节[],我们如何确定消息类型以使用适当的类和反序列化?
【问题讨论】:
标签: java network-programming protocol-buffers
使用 protobuf,我们可以定义消息并生成它们的类,每个类都知道如何序列化/反序列化为二进制。
假设我们已经定义了多个不同的消息, 我们得到了一些字节[],我们如何确定消息类型以使用适当的类和反序列化?
【问题讨论】:
标签: java network-programming protocol-buffers
你不能。协议缓冲区的有线格式不编码消息类型,只编码标签号和类型。
例如,以下protos的消息实例的有线格式将是相同的(显然字符串字段中的数据相同):
message Foo {
optional string foo_field = 1;
}
message Bar {
optional string field_contained_in_bar = 1;
}
如果仅设置了字符串字段,则以下消息的实例可能也具有相同的编码:
message Baz {
optional string str = 1;
optional int32 num = 2;
}
您需要知道您希望收到的消息类型。
请参考in the documentation的编码示例。
【讨论】:
any 类型可以,但这只是一种字段类型 - 如果您的消息仅包含非any 类型怎么办。 any 用作通用类型将非常低效,因为您必须在每条消息上编写类型(因为anys 的列表可以包含不同的类型)。另外,你不知道包含any类型字段的消息的类型。