设置使用 Cereal 序列化库时可以在序列化函数中访问的属性
Setting a property that I can access in the serialize functions when using Cereal serialization library
我正在使用"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"类中,并让它返回我的属性。
我甚至不认为这会编译,但我错了。 我仍在尝试围绕模板编程进行思考。虽然我让这个工作,但我当然不能说这是一个"最佳实践"。
- 如何使用带有非默认构造函数的指针来提升序列化
- g++ 6.3,avx 内联函数上的 Kahan 求和用易失性关键字进行序列化
- 设置使用 Cereal 序列化库时可以在序列化函数中访问的属性
- 使用 boost::序列化代码将 *this 传递给模板函数会产生错误
- 是否可以反序列化(从原始内存块)没有默认构造函数的对象?
- 关于反序列化程序 pop 函数的模板化专用化的歧义
- 使用构造函数作为成员函数的 C++(用于序列化)
- Cereal 找不到任何输出序列化函数
- 用基础和派生类编写虚拟序列化函数
- 崩溃:分段故障:增强序列化加载 - 用null调用构造函数
- 无法在 dlib 中序列化学习的函数
- C++ 促进序列化、构造函数和数据复制
- Boost::序列化 - 如何序列化需要数据分配但没有默认构造函数的数据结构
- Boost序列化程序:除非使用虚拟类析构函数,否则将收到警告C4308
- Boost:在单独的加载/保存函数中非侵入性地序列化类
- C++任意函数反序列化
- 未调用序列化函数
- 用于类自动生成序列化函数的宏
- 序列化C++函数
- 对boost序列化函数的未定义引用