使用GPB,如何使包装器课程停止接受不适合它们的二进制消息?

StackOverflow https://stackoverflow.com/questions/1681263

  •  16-09-2019
  •  | 
  •  

我在用着 Google协议缓冲区 序列化我的一些业务对象(在Java应用程序中)。根据教程中的建议,我将消息构建器包装在我自己的类中,该类别实现了Getter和Setter方法以访问消息的属性。另外,我声明了所有消息字段 optional, ,再次遵循他们的建议。

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

将消息的二进制内容加载到包装器类中时,如果通过错误的类型,我该如何使其丢弃错误?

我当前正在考虑的解决方案将使所有消息都使用所需类型字段(也许是版本字段)扩展了基本消息。如果丢失了这些字段,这将使生成的构建器类抛出异常,如果它们在那里,我可以检查自己的代码。但是,我尚未完成评估这对我的代码产生的影响,我不确定这是否容易。

有帮助吗?

解决方案 2

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

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

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

其他提示

如果您传递到myMessage.parsefrom()的数据不代表该类型的消息,则您将获得无效的ProtococolBufferexception。这对您来说还不够吗?

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top