Boost序列化无法恢复保存的对象

4
这是我的课程外观:
#include <iostream>
#include <boost/dynamic_bitset/dynamic_bitset.hpp>
#include <vector>

#include <fstream>

// include headers that implement a archive in simple text format
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/vector.hpp>

using namespace std;
using namespace boost;

class outer{
    friend class boost::serialization::access;
    public:
        int a;
        class inner{
            friend class boost::serialization::access;
            public:
                int a;
                inner(int a){
                    this->a = a;
                }
                template<class Archive>
                void serialize(Archive & ar,const unsigned int version){
                    ar & a;
                }
                inner(){
                }
        };
        vector<inner> inners;
        outer(int a){
            this->a = a;    
            inners.push_back(inner(this->a+1));     
        }
        outer(){
        }

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

vector<outer> outers;
vector<outer> _outers;

BOOST_CLASS_EXPORT(outer);

int main(int, char*[]) {
    int i;
    std::ofstream ofs("filename.dat");
    for(i=0;i<5;i++)
        outers.push_back(outer(i)); 

    boost::archive::text_oarchive oa(ofs);
    oa << outers;
    std::ifstream ifs("filename.dat");
        boost::archive::text_iarchive ia(ifs);
        // read class state from archive
        ia >> _outers;
  return EXIT_SUCCESS;
}

我创建了一个outer类实例的向量,并将其写入文本流(似乎工作正常)。但当我读取它时,出现错误:
terminate called after throwing an instance of 'boost::archive::archive_exception' what(): input stream error

上面是完整的自包含代码,使用以下命令进行编译:

g++ -I /path/to/boost test.cpp -lboost_serialization

如何修复这个问题?有什么想法吗?

是的,outers 是一个 outer 类实例的向量。 - sanjeev mk
你能把那个放到发布的代码中吗?(包括你使用的所有变量等)MCVE会很受欢迎。并修复缩进等问题。 - Yakk - Adam Nevraumont
@Yakk 已进行了修改。 - sanjeev mk
1
你是否包含了向量序列化头文件? - jgyou
是的,那已经包括在内了。 - sanjeev mk
显示剩余3条评论
1个回答

3

缺少:

#include <boost/serialization/export.hpp>

在读取文件之前,您需要关闭输出存档/流:

int main() {
    {
        std::ofstream ofs("filename.dat");

        std::vector<outer> outers(5);
        std::iota(outers.begin(), outers.end(), 0u);

        {
            boost::archive::text_oarchive oa(ofs);
            oa << outers;
        }
    }

    {
        // read class state from archive
        std::vector<outer> _outers;
        std::ifstream ifs("filename.dat");
        boost::archive::text_iarchive ia(ifs);
        ia >> _outers;

        for(auto& outer : _outers) {
            std::cout << "outer " << outer.a << "\n";

            for (auto& inner: outer.inners)
                std::cout << "   inner " << inner.a << "\n";
        }
    }
}

完整演示

在Coliru上实时查看

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/export.hpp>
#include <boost/serialization/vector.hpp>
#include <iostream>
#include <fstream>

class outer {
    friend class boost::serialization::access;

  public:
    int a;
    class inner {
        friend class boost::serialization::access;

      public:
        int a;
        inner(int a) { this->a = a; }
        template <class Archive> void serialize(Archive &ar, unsigned) { ar &a; }
        inner() {}
    };
    std::vector<inner> inners;
    outer(int a = 0) : a(a), inners {a+1} { }

    template <class Archive> void serialize(Archive &ar, unsigned) {
        ar &a;
        ar &inners;
    }
};


BOOST_CLASS_EXPORT(outer)

int main(int, char *[]) {
    {
        std::ofstream ofs("filename.dat");

        std::vector<outer> outers(5);
        std::iota(outers.begin(), outers.end(), 0u);

        {
            boost::archive::text_oarchive oa(ofs);
            oa << outers;
        }
    }

    {
        // read class state from archive
        std::vector<outer> _outers;
        std::ifstream ifs("filename.dat");
        boost::archive::text_iarchive ia(ifs);
        ia >> _outers;

        for(auto& outer : _outers) {
            std::cout << "outer " << outer.a << "\n";

            for (auto& inner: outer.inners)
                std::cout << "   inner " << inner.a << "\n";
        }
    }
}

打印

outer 0
   inner 1
outer 1
   inner 2
outer 2
   inner 3
outer 3
   inner 4
outer 4
   inner 5

非常感谢,帮助很大! - sanjeev mk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接