有没有办法找出 byte [] 中编码的消息类型?我的意思是,是否有可能开发出类似的东西:
byte [] buf;
if (typeOfMessage(buf) == "AProto") {
AProto.parseFrom(buf);
} else if (typeOfMessage(buf) == "BProto") {
BProto.parseFrom(buf);
}
...
答案 0 :(得分:1)
不,不是。几个不同的消息都可以具有相同的byte[]
表示。消息不随身携带任何类型信息。有线格式为每个标签值指示值的编码是从各种编码中得出的,但这就是它的范围。
如果您想这个功能,那么将它包装到您自己的消息中相对容易:
message MessageWithType {
required string type_name = 1;
required bytes data = 2;
}
基本上,只使用其类型名称包装每个真实消息。这只适用于您控制整个过程的情况,当然......如果您无法更改数据,则无法添加该信息。
正如Kenton所说,对于您感兴趣的固定(且理想情况下很小)的一组类型,您可以使用oneof
声明一个包含每种类型字段的消息(根据ursa的答案)如果您使用的是Protobuf 2.6.0 +。
答案 1 :(得分:1)
它不会按照您的建议方式运作。但有一个诀窍:
message DTO {
// NOTE! The only and only message have to set.
optional AProto aPhoto = 1;
optional BPhoto bPhoto = 2;
...
optional RenderRequest renderRequest = 20;
}
它将一些技术信息添加到消息中,因此您始终知道您正在使用的内容。 此外,它还允许在发生不兼容的更改时跟踪版本控制:
message DTO {
...
//optional BPhoto bPhoto = 2; // Compatibility broken in release 2014-10-09 by ursa
optional BPhoto bPhoto = 21;
...
}