在使用Cereal序列化库时设置我可以在序列化函数中访问的属性

时间:2018-05-31 18:03:16

标签: c++ cereal

我正在使用'Cereal'序列化库(uscilab.github.io/cereal/)来序列化可能有数百万个数字的对象,以及描述这些数字的元数据。在某些情况下,我不需要序列化数字,只需要元数据;其他时候我想要存档。

我能想到的唯一方法是将一个布尔属性添加到cereal.hpp文件中定义的OutputArchive类。我的想法是,当我构建存档时,我设置了这个值。然后,当序列化代码运行时,任何对象都可以访问此属性并序列化适当的值。大多数对象会忽略此属性,但持有(可能)数百万个数字的对象可以根据此属性的值忽略数字。

这是一些帮助解释的伪代码(源自Cereal网站上的示例)。创建存档看起来像这样:

int main()
{
  std::stringstream ss;

  {
    cereal::BinaryOutputArchive oarchive(ss, true); // I modified the constructor to accept a boolean parameter, and set the property
    ...
  }
...

然后,在序列化我的数据对象(保存元数据的对象和数百万个数字)的函数中:

template<class Archive>
void save(Archive& ar) const
{
    ar(metadata);
    ar(more_meta_data);

    boolean bArchiveEverything = ar.ArchiveNumbers(); //<<-- this is what I don't know how to accomplish

    ar(bArchiveEverything); // put this into the archive, so I know what to expect when deserializing
    if (bArchiveEverything) {
        ar(bigVectorOfNumbers);
    }
}

我的问题:

1)我说这一切都错了吗?我缺少一种更简单,更优雅的方式吗?

2)如果没有,这似乎是合理的,我不确定如何通过'Archive&amp;'访问OutputArchive中的我的财产传递给Cereal序列化所需的模板函数的参数。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我仍然不知道这是否是最好的方式,所以我无法回答我的第一个问题。

然而,访问该物业并没有那么困难。事实证明,只要所有的类都被传递到“保存”中。作为&#39; ar&#39;具有相同的功能,我可以像我的伪代码函数&#34; ArchiveNumbers()&#34;一样使用该函数。所以,我所要做的就是将该功能添加到&#39; OutputArchive&#39;在谷歌中的类,让它归还我的财产。

我没想到会编译,但我错了。我仍然试图围绕模板编程。虽然我让这个工作,我当然不能说这是一个最好的做法&#39;。