gpt4 book ai didi

c++ - 从序列化数据中查找 Protocol Buffer 消息类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:50 24 4
gpt4 key购买 nike

我有一些二进制数据,它是通过序列化一个谷歌 Protocol Buffer 类获得的。我如何在运行时找出为其序列化数据的类。

例如,假设我有一个类abc。我把这个类abc序列化成二进制数据。有没有什么方法可以验证这个二进制数据是通过序列化 class abc, 而不是其他一些类获得的?

另外,如果我用xyz类的parse方法解析这个abc类的二进制数据,我怎么知道解析是否成功。

最佳答案

protobuf 不包含在线路上的任何类型信息(除非您自己在 protobuf 外部这样做)。因此,您不能严格验证 - 这实际上是一件的事情,因为这意味着类型是可互换和兼容的。只要 class abc 具有与其他类型兼容的契约,它就可以工作。这里的“兼容”是指:对于两者共有的任何字段编号,它们具有兼容的线型。如果 abc 声明字段 4 为字符串,而另一个类声明字段 4 为 double ,则反序列化将失败。

您可以使用的另一个“信号”是省略必需 字段:如果abc 始终包含字段 3,但您得到的数据省略 字段 3,那么它可能不是 abc。请注意,protobuf 被设计为版本容错,但:您不能假设 extra 字段意味着它不是 abc,因为它可能是数据是使用更高版本的契约(Contract),或者正在使用扩展字段。同样,缺少可选字段可能会丢失,因为或者他们只是选择不提供值,或者该字段未在他们正在使用的契约(Contract)。

重新测试是否成功解析:这将是特定于实现的。我会想象 c++ 实现将具有要检查的返回值或要检查的标志字段。我自己不使用那个 api,所以我不能说。在其他一些平台上,如果出现严重问题,我希望抛出异常(java、.net 等)。

关于c++ - 从序列化数据中查找 Protocol Buffer 消息类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15246043/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com