【问题标题】:protobuf determining message type to deserializeprotobuf 确定要反序列化的消息类型
【发布时间】:2015-09-17 21:01:20
【问题描述】:

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

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

【问题讨论】:

    标签: java network-programming protocol-buffers


    【解决方案1】:

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

    例如,以下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的编码示例。

    【讨论】:

    • proto 3 中的 ANY 类型怎么样?我刚刚读到它们,但似乎那些是为了解决这个问题,它们确实包含类型的 URI,对于 java,我认为它是完整的包名......github.com/google/protobuf/blob/master/src/google/protobuf/…
    • 或者我必须做一些通用类型 {string type, bytes message} 然后解码泛型类型然后根据“类型”解码使用适当的类做 decdoe 目标消息? (原来是双重解码)
    • 是的,any 类型可以,但这只是一种字段类型 - 如果您的消息仅包含非any 类型怎么办。 any 用作通用类型将非常低效,因为您必须在每条消息上编写类型(因为anys 的列表可以包含不同的类型)。另外,你不知道包含any类型字段的消息的类型。
    • 所以如果我有不同的类型,我需要做双重解码吗?那是解决方案吗?就像先放一个 int 然后通过该 int 确定类型然后才解码?
    • 等待 ANY 代表复合类型,它就像是在 proto 文件中某处定义的整个不同消息类型的占位符......所以它解决了问题,但是正如你所说的字符串每次都会包含完整的包名...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 2012-02-27
    • 2013-05-29
    • 1970-01-01
    相关资源
    最近更新 更多