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

Setting a property that I can access in the serialize functions when using Cereal serialization library

本文关键字:序列化 函数 访问 属性 Cereal 设置      更新时间:2023-10-16

我正在使用"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&"参数访问我在 OutputArchive 中的属性,该参数被传递到 Cereal 序列化所需的模板函数中。

提前感谢任何帮助。

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

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

我甚至不认为这会编译,但我错了。 我仍在尝试围绕模板编程进行思考。虽然我让这个工作,但我当然不能说这是一个"最佳实践"。