【问题标题】:How to boost::serialize an std/boost::optional?如何 boost::serialize 一个 std/boost::optional?
【发布时间】:2014-11-21 14:33:03
【问题描述】:

如何序列化包含boost::optional 的类(使用boost::serialization)?

即下面的代码在实例化的时候会报错。

error C2039: 'serialize' : is not a member of 'boost::optional' C:\boost\boost_1_55_0\boost\serialization\access.hpp 118

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

class MyClass {
private:
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & my_member;
    }

    boost::optional<int> my_member;
};

int main() {
    std::ofstream ofs("filename.txt");
    const MyClass g;
    boost::archive::text_oarchive oa(ofs);
    oa << g;
    return 0;
}

我知道可能涉及更深层次的问题(当值不存在时,您应该向文件写入什么?),但必须有一些标准解决方案。我正在寻找最简单的方法来解决这个问题。

【问题讨论】:

标签: c++ c++11 serialization boost optional


【解决方案1】:

对于boost::optional,您只需添加#include &lt;boost/serialization/optional.hpp&gt;

它实现了一个非成员序列化函数,可以让你序列化boost::optional而不用担心细节。

在后台,它首先保存/加载布尔值t.is_initialized(),然后根据其值决定是否保存/加载其余部分。

您可以在此处查看源代码:http://www.boost.org/doc/libs/1_56_0/boost/serialization/optional.hpp

【讨论】:

  • 我真的很惊讶这并没有出现在我的 Google 搜索中。我很彻底,看起来我是唯一一个提出这个问题的人,这让我很惊讶。现在再看一遍,标题确实弹出了——我想我搜索得太“问题”了。
  • 对于任何未来的读者来说,它似乎不适用于 xml_[i|o]archive,它给出了一个冗长的模板错误。文本和二进制档案工作正常。
  • 实际上,使用 binary_iarchive 加载带有选项的文件也不起作用,它会产生运行时错误 R6010。稍后我可能会在一个新问题中跟进它,但目前我对 text_archive 很满意。
  • @Ela782 xmlarchive 需要节点名称。使用 make_nvpair 或 BOOST_SERIALIZATION_NV_PAIR 或类似的(引用内存,因为我现在在非常慢的移动网络上)。
  • @sehe:我昨天已经试过 BOOST_SERIALIZATION_NVP,它没有做任何改变,xml 序列化仍然不能与 boost::optional 一起工作。
猜你喜欢
  • 1970-01-01
  • 2013-12-05
  • 2018-02-28
  • 2020-05-19
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
相关资源
最近更新 更多