Google协议缓冲区:找出byte []中编码的邮件

时间:2014-10-09 11:42:19

标签: java protocol-buffers

有没有办法找出 byte [] 中编码的消息类型?我的意思是,是否有可能开发出类似的东西:

byte [] buf;

if (typeOfMessage(buf) == "AProto") {
  AProto.parseFrom(buf);
} else if (typeOfMessage(buf) == "BProto") {
  BProto.parseFrom(buf);
}

...

2 个答案:

答案 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;
    ...
}