0

我正在使用“谷物”序列化库 (uscilab.github.io/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&”参数访问我在 OutputArchive 中的属性,该参数被传递到 Cereal 序列化所需的模板函数中。

提前感谢您的帮助。

4

1 回答 1

0

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

然而,访问该物业并没有那么困难。事实证明,只要作为 'ar' 传递给 'save' 函数的所有类都具有相同的函数,我就可以像我的伪代码函数“ArchiveNumbers()”一样使用该函数。因此,我所要做的就是将该函数添加到 Cereal 中的“OutputArchive”类中,并让它返回我的属性。

我认为这甚至不会编译,但我错了。我仍在尝试围绕模板编程。虽然我得到了这个工作,但我当然不能说这是一个“最佳实践”。

于 2018-05-31T22:36:28.180 回答