C++ 序列化库 Cereal使用(二)

2019/11/02 C++

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我.

捐赠

如果觉得分享的内容不错,可以请作者喝杯咖啡.


Show Disqus Comments

Search

    欢迎关注我的微信号

    一个不羁的码农

    不羁的程序员

    转载请注明出处!

    Table of Contents