0

I have found this code and trying to modify it for binary object serialization on visual studios. But on doing so it throws exception

"Unhandled exception at 0x00007FFF269954D8 in Boost_Serialization.exe: Microsoft C++ exception: std::length_error at memory location 0x000000829D94F7B0."

Not sure what's wrong.

#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
  • 1
    "I have found this code" ... \(^-^)/ Commented Feb 1, 2019 at 8:39

1 Answer 1

1

You use BOOST_SERIALIZATION_SPLIT_MEMBER() and do not implement save method. However, you do not need to do that. Remove splitting and implement general void serialize(Archive & ar, const unsigned int version) method (note to include new header for vector serialization). It will look like this and run like a charm:

#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;
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.