0

我查看了 Boost Serialization 和 Cereal 库的文档,但没有找到任何具体的内容。我想知道是否可以对序列化数据进行完整性检查。我不是在谈论安全方面,但如果出于任何原因保存的文件损坏,则加载的数据可能完全错误。这些库中是否有关于这方面的支持?我想自己实现类似的东西,但是两个库的加载阶段都存在问题:

template<class Archive>
void load(Archive& ar) {
   //checksum here??
   ar >> mydata;
}

为了计算校验和,我需要读取所有数据。但是,对于这两个库,我无法从存档中提取任何内容,我只能填写类属性,希望所有内容都加载没有错误,然后我可以计算校验和。我想在加载类属性之前计算校验和。可能吗?

4

1 回答 1

0

我不知道专门执行此操作的序列化。

必要时,有时要做的是序列化一个对象,然后该字节流及其散列是另一个也被序列化的中间对象中的字段。这个最终的字节流就是传输的内容。

在接收到该字节流被反序列化,重新生成中间对象。计算其字节流字段的哈希值并与其哈希字段进行比较。如果一切正常,则可以安全地反序列化字节流字段以重新生成原始对象。

这有点低效 - 有两个对象要序列化。然而,中间对象大多只是一个字节流,这对于序列化通常非常简单(特别是对于像 GPB 这样的二进制序列化器)。

它也经常是不必要的。文件系统、TCP 等已经内置了大量的错误检查和纠正功能。如果您的传输/存储介质已经内置了数据完整性检查负载,那么补充它可能是矫枉过正。您提到文件存储 - 使用像 ZFS 这样的文件系统将是确保数据完整性良好(加上许多其他好处)的绝佳方式,减少了您自己检查的需要。无论您做什么,ZFS 都会对存储的数据进行纠错。

于 2020-03-08T23:35:43.187 回答