Tus*_*oul 5 c++ serialization protocol-buffers
我有一些二进制数据,这些数据是通过序列化 google 协议缓冲区类获得的。我如何在运行时找出数据被序列化的类。
例如,假设我有一个类 abc。我将此类 abc 序列化为二进制数据。有没有办法验证这个二进制数据是通过序列化类 abc而不是其他类获得的?
此外,如果我通过xyz 类的 parse 方法解析 abc 类的二进制数据,我怎么知道解析是否成功。
protobuf 不包含线路上的任何类型信息(除非您自己在 protobuf 外部执行此操作)。因此,您无法严格验证这一点 - 这实际上是一件好事,因为这意味着类型是可以互换和兼容的。只要有与其他类型class abc
兼容的合约,它就可以工作。这里的“兼容”是指:对于两者共有的任何字段号,它们具有兼容的电线类型。如果abc
将字段 4 声明为字符串,而另一个类将字段 4 声明为双精度数字,则反序列化将失败。
您可以使用的另一个“信号”是省略字段required
:如果abc
始终包含字段 3,但您获得的数据省略了字段 3,那么它可能不是abc
. 请注意,protobuf 被设计为版本容错的:您不能假设额外的字段意味着它不是abc
,因为数据可能正在使用更高版本的合约,或者正在使用扩展字段。同样,缺少可选字段也可能会丢失,因为他们要么只是选择不提供值,要么没有在他们使用的合约版本上声明该字段。
重新测试是否成功解析:这将是特定于实现的。我想C ++ 实现要么有一个返回值要检查,要么有一个标志字段要检查。我自己不使用该 api,所以我不能说。在其他一些平台上,如果出现严重问题,我预计会抛出异常(java、.net 等)。