提升序列化在从二进制文件读取时引发异常

Boost Serialization throws exception while reading from binary

本文关键字:异常 读取 二进制文件 升序 序列化      更新时间:2023-10-16

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

"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;

您使用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;
}