我正在使用“谷物”序列化库 (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 序列化所需的模板函数中。
提前感谢您的帮助。