从二进制读取时,Boost序列化引发异常

时间:2019-02-01 08:36:16

标签: c++ boost

我找到了此代码,并尝试对其进行修改以在Visual Studio上进行二进制对象序列化。但是这样做会引发异常

“ Boost_Serialization.exe中0x00007FFF269954D8处未处理的异常:Microsoft C ++异常:内存位置0x000000829D94F7B0处的std :: length_error。”

不确定怎么了。

#include <iostream>
#include <vector>  
#include <fstream>   
#include <boost/serialization/vector.hpp>   
#include<boost/archive/binary_oarchive.hpp>
#include<boost/archive/binary_iarchive.hpp>
#include<boost/serialization/binary_object.hpp>


class Info
{
private:
// Allow serialization to access non-public data members.  
friend class boost::serialization::access;

//template<class Archive>
//void save(Archive & ar, const unsigned int version) const { ar & filenames;}

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

BOOST_SERIALIZATION_SPLIT_MEMBER()
std::vector<std::string> filenames;

public:
void AddFilename(const std::string& filename);
void Print() const;
};

void Info::Print() const { std::copy(filenames.begin(),filenames.end(),std::ostream_iterator<std::string>(std::cout, "\n")); }
void Info::AddFilename(const std::string& filename) { filenames.push_back(filename); }


int main(int argc, char** argv)
{
std::vector<Info> infs;

Info info1, info2;
info1.AddFilename("ThisFile.txt");
info2.AddFilename("ThatFile.txt");
info2.AddFilename("OtherFile.txt");

info2.AddFilename("ABC");
info2.AddFilename("123");
info2.AddFilename("XYZ");

infs.push_back(info1);
infs.push_back(info2);

// Save filename data contained in Info object  
{
    std::ofstream Obj_ofstream("data.dat", std::ios::binary);
    boost::archive::binary_oarchive op_archive(Obj_ofstream);
    op_archive << boost::serialization::make_binary_object(&infs, sizeof(infs));
    //Obj_ofstream.close();
}

// Restore from saved data and print to verify contents  
std::vector<Info> restored_info;
{
    std::ifstream Obj_ifstream("data.dat", std::ios::binary);
    boost::archive::binary_iarchive ip_archive(Obj_ifstream);
    ip_archive >> restored_info;
    //Obj_ifstream.close();
}

//std::vector<Info>::const_iterator it = restored_info.begin();
//for (; it != restored_info.end(); ++it)
//{
//  Info info = *it;
//  info.Print();
//}

std::cout << "Testing : " << std::endl;
return 0;

1 个答案:

答案 0 :(得分:1)

您使用BOOST_SERIALIZATION_SPLIT_MEMBER()并且不实现保存方法。但是,您不需要这样做。删除拆分并实现常规的void serialize(Archive & ar, const unsigned int version)方法(请注意包括用于向量序列化的新标头)。它将看起来像这样,并像魅力一样运行:

#include <iostream>
#include <vector>  
#include <fstream>   
#include <boost/serialization/vector.hpp>   
#include<boost/archive/binary_oarchive.hpp>
#include<boost/archive/binary_iarchive.hpp>
#include<boost/serialization/binary_object.hpp>
#include<boost/serialization/vector.hpp>


class Info
{
private:
    // Allow serialization to access non-public data members.  
    friend class boost::serialization::access;

    //template<class Archive>
    //void save(Archive & ar, const unsigned int version) const { ar & filenames;}

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

    std::vector<std::string> filenames;

public:
    void AddFilename(const std::string& filename);
    void Print() const;
};

void Info::Print() const { std::copy(filenames.begin(), filenames.end(), std::ostream_iterator<std::string>(std::cout, "\n")); }
void Info::AddFilename(const std::string& filename) { filenames.push_back(filename); }


int main(int argc, char** argv)
{
    std::vector<Info> infs;

    Info info1, info2;
    info1.AddFilename("ThisFile.txt");
    info2.AddFilename("ThatFile.txt");
    info2.AddFilename("OtherFile.txt");

    info2.AddFilename("ABC");
    info2.AddFilename("123");
    info2.AddFilename("XYZ");

    infs.push_back(info1);
    infs.push_back(info2);

    // Save filename data contained in Info object  
    {
        std::ofstream Obj_ofstream("data.dat", std::ios::binary);
        boost::archive::binary_oarchive op_archive(Obj_ofstream);
        op_archive << infs;
        //Obj_ofstream.close();
    }

    // Restore from saved data and print to verify contents  
    std::vector<Info> restored_info;
    {
        std::ifstream Obj_ifstream("data.dat", std::ios::binary);
        boost::archive::binary_iarchive ip_archive(Obj_ifstream);
        ip_archive >> restored_info;
        //Obj_ifstream.close();
    }

    std::vector<Info>::const_iterator it = restored_info.begin();
    for (; it != restored_info.end(); ++it)
    {
      Info info = *it;
      info.Print();
    }

    std::cout << "Testing : " << std::endl;
    system("PAUSE");
    return 0;
}