C++ 如何boost::序列化std/boost::optional?

C++ 如何boost::序列化std/boost::optional?,c++,c++11,serialization,boost,optional,C++,C++11,Serialization,Boost,Optional,如何序列化包含boost::optional的类(使用boost::serialization) 即,以下代码在实例化时将给出一个错误 错误C2039:“序列化”:不是“boost::optional”C:\boost\boost\u 1\u 55\u 0\boost\serialization\access.hpp 118的成员 #包括 #包括 类MyClass{ 私人: 好友类boost::serialization::access; 模板 无效序列化(存档和ar,常量未签名整数版本) {

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

即,以下代码在实例化时将给出一个错误

错误C2039:“序列化”:不是“boost::optional”C:\boost\boost\u 1\u 55\u 0\boost\serialization\access.hpp 118的成员

#包括
#包括
类MyClass{
私人:
好友类boost::serialization::access;
模板
无效序列化(存档和ar,常量未签名整数版本)
{
ar&我的大学会员;
}
boost::可选的my_成员;
};
int main(){
std::ofs流(“filename.txt”);
常数MyClass g;
boost::archive::text\u oarchive oa(ofs);

oa对于
boost::可选的
您只需要添加
#include

它实现了一个非成员序列化函数,允许您序列化
boost::optional
,而无需担心细节

在引擎盖下,它首先保存/加载布尔值
t.\u initialized()
,并根据其值决定是否保存/加载其余值


你可以在这里看到源代码:

然后你可以考虑实现一些适用于std
可选的
的东西。事实上,我很惊讶在我的谷歌搜索中没有出现这个问题。我非常彻底,看起来我是唯一一个有这个问题的人,这让我很惊讶。现在再看一看,标题在契约弹出-我想我搜索的太“像问题一样”。对于任何未来的读者来说,它似乎不适用于xml[I|o]存档,它会给出一个很长的模板错误。文本和二进制存档可以很好地工作。实际上,用二进制文件加载带有选项的文件也不起作用,它会产生一个运行时错误R6010。我可能稍后会在一个新问题中跟进它,但目前我对文本存档很满意。@Ela782 xmlarchive需要节点名。使用make\u NVOr BOOST_SERIALIZATION_NV_PAIR或类似的(从内存中引用,因为我现在在非常缓慢的移动网络上)。@sehe:我昨天已经尝试了BOOST_SERIALIZATION_NVP,它没有做任何更改,xml序列化仍然不能与BOOST::optional一起工作。
#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;
}