本文主要参考官方使用指南。
Cereal是一个轻便的C++序列化工具。
安装使用
为了在项目中使用cereal,只需要从Github上下载,随后让项目使用cereal_base_dir/include/cereal
即可,无需编译。
选择归档方式
Cereal支持二进制、XML和JSON归档。可以根据需要引用头文件:
#include <cereal/archives/binary.hpp>
#include <cereal/archives/portable_binary.hpp>
#include <cereal/archives/xml.hpp>
#include <cereal/archives/json.hpp>
类的序列化
Cereal需要知道类中哪些数据成员需要被序列化,为此,要在类中实现一个serialize
方法:
struct MyClass
{
int x, y, z;
// This method lets cereal know which data members to serialize
template<class Archive>
void serialize(Archive & archive)
{
archive( x, y, z ); // serialize things by passing them to the archive
}
};
序列化数据
为了序列化数据,首先需要创建一个cereal archive,随后向其中发送数据。应当通过RAII(Resource Acquisition Is Initialization,资源获取即初始化)的方式使用Cereal archive以保证数据被正常地存储或读取。Cereal archive通常以一个std::istream
/std::ostream
或者std::ifstream
/std::ofstream
对象作为参数来构造。
#include <cereal/archives/binary.hpp>
#include <sstream>
int main()
{
std::stringstream ss; // any stream can be used
{
cereal::BinaryOutputArchive oarchive(ss); // Create an output archive
MyData m1, m2, m3;
oarchive(m1, m2, m3); // Write the data to the archive
} // archive goes out of scope, ensuring all contents are flushed
{
cereal::BinaryInputArchive iarchive(ss); // Create an input archive
MyData m1, m2, m3;
iarchive(m1, m2, m3); // Read the data from the archive
}
}
Naming values
在一些场合(尤其是希望将数据归档为XML或者JSON时),常常会希望构建“名称/值”对(name-value pair)来帮助阅读。常见的方法有CEREAL_NVP(D)``cereal::make_nvp(N, V)
:
#include <cereal/archives/xml.hpp>
#include <fstream>
int main()
{
{
std::ofstream os("data.xml");
cereal::XMLOutputArchive archive(os);
MyData m1;
int someInt;
double d;
archive( CEREAL_NVP(m1), // Names the output the same as the variable name
someInt, // No NVP - cereal will automatically generate an enumerated name
cereal::make_nvp("this_name_is_way_better", d) ); // specify a name of your choosing
}
{
std::ifstream is("data.xml");
cereal::XMLInputArchive archive(is);
MyData m1;
int someInt;
double d;
archive( m1, someInt, d ); // NVPs not strictly necessary when loading
// but could be used (even out of order)
}
}
其他
关于RAII资源获取即初始化,可以参考:
https://www.jianshu.com/p/b7ffe79498be
网友评论