cereal进阶
上一篇介绍了 cereal
基本用法,可以满足基础的需求了,这里记录下一些注意事项.
- 序列化函数在外部情况时,必须确保序列化函数和class在同一个变量域中
比如:
bool QDicomFilePrivate::loadDicomTagToFile(const QString &strFile)
{
CHECK_POINTER_BOOL(m_pDicomTag);
bool bResult = false;
if (strFile.contains (".json"))
{
std::ofstream os(strFile.toStdString ());
cereal::JSONOutputArchive archive(os);
archive(cereal::make_nvp("dicomTag" ,*m_pDicomTag));
}
else if (strFile.contains (".xml"))
{
std::ofstream os(strFile.toStdString ());
cereal::XMLOutputArchive archive(os);
archive(cereal::make_nvp("dicomTag" ,*m_pDicomTag));
}
return bResult;
}
那么我的 QDicomTag
对象的序列化函数也必须和QDicomFilePrivate
在同一个变量域
void serialize(Archive &ar, QDicomTag &tag, std::uint32_t const &version)
{
...
}
- 反序列化时,必须确保传入的文件存在,不存在会抛出异常!
比如:
std::ifstream os(strPath);
cereal::JSONInputArchive archive(os);
MyData data;
archive(cereal::make_nvp("dicomTag",data));
如果strPath
路径不存在,则会发生如下异常:
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
terminate called after throwing an instance of 'cereal::RapidJSONException'
what(): rapidjson internal assertion failure: IsObject()
其他
参考文章
作者:鹅卵石
时间: 2019年11月16日23:00:11
版本:V 0.0.1
邮箱:kevinlq@163.com
微信公众号:devstone
版权:本博客若无特别声明,均属于作者原创文章,欢迎大家转载分享。但是,
希望您注明来源,并留下原文地址,这是对作者最大的尊重,也是对知识的尊重。
如果您对本文有任何问题,可以在下方留言,或者Email我.
捐赠
如果觉得分享的内容不错,可以请作者喝杯咖啡.