我要将一些大对象存储到数据库 (BLOB) 中。在我看来,protobuf 是序列化/反序列化 BLOB 的最佳候选者之一。尽管它具有二进制格式,但它仍然易于阅读和更改其内容(字符串、整数等)。所以我需要某种数据验证,无论何时它的原始 BLOB 或修改(由黑客?由太聪明的用户?)。
一种可能性是在表中有一个专用字段,称之为 crc
,计算 BLOB 的校验和并将其放在那里。但是当 crc 是 BLOB 本身的一部分时,它会好得多(在许多情况下)。
我可以在 protobuf 流的末尾添加额外的字节,但我必须删除它们(否则反序列化器将抛出异常“无效字段 blablabla”)。
我可以将 protobuf 流放入包装器中,但解包/包装又是开销。
是否有一种简单而廉价的方法可以在 protobuf 流的末尾添加一些东西,以避免在反序列化过程中需要额外的操作?在 XML 中,我可以添加注释。我认为 protobuf 中没有注释,但是如何将 1 个或 2 个字节的 CRC 放在示例中?
最佳答案
Protobuf 流是可附加的。如果您知道数据中不存在的字段编号,则可以简单地针对该字段附加数据。如果您打算添加 1 或 2 个字节的 CRC 数据,那么“varint”可能是您最好的选择(请注意,“varint”是一种 7 位编码格式,第 8 位是延续标记,因此您可能想要使用7、14 或 21 位或实际 CRC 数据),然后您可以附加:
然而!问题在于解码器仍然会经常解释和存储这些数据,这意味着如果您对其进行序列化,它将在输出中包含这些数据。
另一种避免这种情况的方法是将 protobuf 数据封装在您自己设计的某种框架机制中。例如,您可以选择执行以下操作:
我可能会选择第二个选项。请注意,如果需要,您可以为长度前缀选择“varint”编码而不是固定长度编码。不过对于 CRC 来说可能不值得,因为 将 定长。
关于protocol-buffers - Protobuf 校验和 (crc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22781849/