C++ 增强和保持完整性

C++ 增强和保持完整性,c++,serialization,boost,cereal,C++,Serialization,Boost,Cereal,我查看了Boost序列化和谷物库的文档,但没有找到任何具体的内容。我想知道是否有可能在序列化数据中进行完整性检查。我不是说安全方面,但如果出于任何原因保存的文件已损坏,则加载的数据可能完全错误。这些库中是否支持这方面的内容?我自己也曾想过实现类似的功能,但在两个库的加载阶段都存在一个问题: template<class Archive> void load(Archive& ar) { //checksum here?? ar >> mydata; }

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

template<class Archive>
void load(Archive& ar) {
   //checksum here??
   ar >> mydata;
}
模板
无效加载(存档和应收账款){
//这里的校验和??
ar>>我的数据;
}

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

我不知道有哪种序列化专门做到这一点

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

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

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

这也常常是不必要的。文件系统、TCP等已经内置了大量的错误检查和更正功能。如果您的传输/存储介质中已经内置了大量的数据完整性检查,那么补充它可能会有点过头。您提到了文件存储—使用像ZFS这样的文件系统将是确保数据完整性良好(再加上大量其他好处)的极好方法,从而减少您自己检查的需要。无论您做什么,ZFS都将对存储的数据应用错误更正