c++ - Boost序列化在从二进制文件读取时抛出异常

标签 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;

最佳答案

您使用 BOOST_SERIALIZATION_SPLIT_MEMBER() 并且没有实现保存方法。但是,您不需要这样做。删除拆分并实现通用 void serialize(Archive & ar, const unsigned int version) 方法(注意包含 vector 序列化的新 header )。它看起来像这样,运行起来也很迷人:

#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;
}

关于c++ - Boost序列化在从二进制文件读取时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54475703/

相关文章:

c++ - 深度优先搜索(DFS)编码

c++ - boost 序列化按位序列化能力

Boost 错误,编译 xtime.hpp 时遇到问题

c++ - 如何知道 Boost asio 中 SSL 套接字的状态

c++ - 如何在boost::asio中将打包的结构作为消息传递? (不进行序列化)

boost - 执行 bcp 后构建依赖的 boost 库

javascript - 使用 C++ 获取 HTTP get 参数

c++ - 为什么当客户端只关闭发送一半的连接时,HTTP 服务器就关闭连接?

c++ - {error C2338: (boost::has_trivial_destructor<T>::value)} 对于 boost::lockfree::queue 意味着什么?我在这里缺少什么?

c++ - 如何从方法访问类成员?