2015-09-17 57 views
3

使用protobuf我们可以定义消息并生成它们的类,并且每个类都将知道如何序列化/反序列化为二进制。protobuf确定要反序列化的消息类型

假设我们已经定义了多个不同的消息, ,并且我们得到了一些字节[],我们如何确定消息类型以使用适当的类和反序列化?

回答

4

你不能。协议缓冲区的连线格式不对消息类型进行编码,只对标签号和类型进行编码。

例如,下面的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

+0

proto 3中的任何类型怎么样?我刚刚阅读了他们,但似乎这些是要解决这个问题,他们确实包含的类型的URI,对于Java我认为这是完整的包名称... https://github.com/google/protobuf/ blob/master/src/google/protobuf/any.proto – vach

+0

或者我可能必须做一些类似的泛型类型{字符串类型,字节消息}然后解码泛型类型,然后根据类型解码使用适当的类做decdoe目标消息? (原来是双解码) – vach

+0

是的,“any”类型,但这只是一个字段类型 - 如果你的消息只包含非''any'类型,那么怎么办?因为你必须在每条消息上编写类型(因为'any'列表可以包含不同的类型),所以任何一种方法都会非常低效。另外,您不知道包含“any”类型字段的消息的类型。 –

相关问题