Java protobuf确定要反序列化的消息类型

Java protobuf确定要反序列化的消息类型,java,network-programming,protocol-buffers,Java,Network Programming,Protocol Buffers,使用protobuf,我们可以定义消息并生成它们的类,每个类都知道如何序列化/反序列化为二进制 假设我们已经定义了多个不同的消息, 我们从线路上得到一些字节[],如何确定消息类型以使用适当的类并进行反序列化?您不能。协议缓冲区的有线格式不编码消息类型,只编码标记号和类型 例如,以下协议的消息实例的有线格式将是相同的(显然,字符串字段中的数据相同): 如果仅设置了字符串字段,则以下消息的实例也可能具有相同的编码: message Baz { optional string str = 1;

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

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

您不能。协议缓冲区的有线格式不编码消息类型,只编码标记号和类型

例如,以下协议的消息实例的有线格式将是相同的(显然,字符串字段中的数据相同):

如果仅设置了字符串字段,则以下消息的实例也可能具有相同的编码:

message Baz {
  optional string str = 1;
  optional int32 num = 2;
}
您需要知道希望接收的邮件类型


请参考编码示例。

proto 3中的任何类型如何?我刚刚读过关于它们的文章,但似乎它们正是为了解决这个问题,而且它们确实包含类型的URI,对于java,我认为这是完整的包名。。。或者可能我必须做一些类似于泛型{string type,bytes message}的事情,然后解码泛型,然后根据“type”进行解码使用合适的类做decdoe目标消息?(结果是双重解码)是的,
any
类型确实如此,但这只是一种字段类型-如果您的消息只包含非
any
类型,该怎么办。any作为通用类型使用将非常低效,因为您必须在每条消息上写入该类型(因为
any
s的列表可以包含不同的类型)。另外,您不知道包含
any
type字段的消息的类型。因此,如果我有不同的类型,我需要进行双重解码?这就是解决办法吗?就像先输入一个int,然后根据该int确定类型,然后才进行解码?等一下,ANY代表复合类型,它就像是在proto文件中某个地方定义的整个不同消息类型的占位符。。。所以它解决了这个问题,但是是的,正如你所说的,每次都会包含一个带有完整包名的字符串。。。
message Baz {
  optional string str = 1;
  optional int32 num = 2;
}