0

我正在使用Google Protocol Buffers来序列化我的一些业务对象(在 Java 应用程序中)。按照教程中的建议,我将消息构建器包装在我自己的类中,该类实现 getter 和 setter 方法来访问消息的属性。optional此外,我再次按照他们的建议声明了所有消息字段。

现在,我可以为任何包装类提供任何编码消息,它们将始终解析并接受它们。这会导致包装器对象表示它们实际上不包含的消息类型,并且会发生很多虚假事件。

将消息的二进制内容加载到包装器类中时,如果传递了错误的类型,如何使其抛出错误?

我目前正在考虑的解决方案是让所有消息都扩展一个带有必需类型字段(可能还有一个版本字段)的基本消息。如果这些字段丢失,这将使生成的构建器类抛出异常,如果它们在那里,我可以签入我自己的代码。但是,我还没有完成评估这对我的代码有什么影响,我不确定这会不会很容易。

4

2 回答 2

1

如果您传递给 MyMessage.parseFrom() 的数据不代表该类型的消息,您将收到 InvalidProtocolBufferException。这对你来说还不够吗?

PB 消息不是自描述的,因此需要(通过某种方式)知道您正在尝试解析哪条消息。当然,您可以尝试解析它们并捕获 InvalidProtocolBufferException,但这不是很好。相反,我认为大多数人都在使用您描述的方法:使用带有类型字段(通常是枚举)和许多可选字段的基本消息类,每个可能的子类型都有一个。这允许您解析消息,然后打开消息类型以提取消息的实际“有效负载”。

于 2009-11-05T22:08:29.813 回答
1

这似乎也是其他人所做的,对我来说效果很好:

message TypedMessage {
    required string type = 1;
    required bytes payload = 2;
}

实际消息以序列化形式进入有效负载字段,类型用于获取正确的构建器和包装器类。该字段也可以是枚举,我目前正在使用 Java 类名,稍后我可能会用不同的系统替换它,因为这意味着重构会破坏解析器的向后兼容性。

于 2009-11-06T16:03:02.803 回答