在Cereal序列化库中实现可在序列化函数访问的自定义属性的疑问
我正在用Cereal序列化库处理包含数百万数值及其元数据的对象,现在遇到了一个场景需求:有些情况下只需要序列化元数据,不需要那些大量的数值;但有的时候又得同时把元数据和数值都序列化进去。
我自己琢磨了一个实现思路:打算在cereal.hpp定义的OutputArchive类里加一个布尔属性,构造归档的时候就设置好这个值。序列化运行的时候,对象可以访问这个属性,然后决定要序列化哪些内容——大部分对象会忽略这个属性,但持有大量数值的对象可以根据这个属性值来判断要不要把数值也序列化进去。
构造归档的示例代码
int main() { std::stringstream ss; { cereal::BinaryOutputArchive oarchive(ss, true); // 我修改了构造函数,让它能接收布尔参数并设置那个自定义属性 // ... 其他序列化操作 } // ... }
持有大量数值的对象序列化函数
template<class Archive> void save(Archive& ar) const { ar(metadata); ar(more_meta_data); boolean bArchiveEverything = ar.ArchiveNumbers(); // <<-- 这部分我不知道怎么实现 ar(bArchiveEverything); // 把这个值存入归档,方便反序列化时知道预期的内容 if (bArchiveEverything) { ar(bigVectorOfNumbers); } }
我的疑问
- 我的这个思路有没有问题?有没有更简洁优雅的解决方案?
- 如果当前这个方案是可行的,那怎么通过序列化模板函数传入的
Archive&参数,访问到OutputArchive里的那个自定义属性呢?
内容的提问来源于stack exchange,提问作者user3074363
相关产品推荐
相关产品推荐

