C++ Boost序列化无法还原保存的对象

C++ Boost序列化无法还原保存的对象,c++,serialization,boost,boost-serialization,C++,Serialization,Boost,Boost Serialization,我的班级是这样的: #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

我的班级是这样的:

#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;
}
我该怎么解决这个问题,有什么想法吗

缺失:

#include <boost/serialization/export.hpp>

我假设
outers
是在real main()中的其他地方声明的?是的,
outers
outer
类实例的向量。您能将其移动到发布的代码中吗?(您使用的所有变量等)感谢MCVE。和修复缩进等。@Yakk进行了编辑。你包括向量序列化标题了吗?非常感谢,非常有帮助!
#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";
        }
    }
}
#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