Boost logo

Boost Users :

Subject: [Boost-users] Boost 1.45 Serialization : Getting archive exception while loading
From: Tejaswin Macharla (tejaswin.m_at_[hidden])
Date: 2011-01-12 05:11:45


Hi,

I have changed the sample code given in the Boost site for Serialization and
the saving of the file works fine.
The code works fine without the switch case as it executes save and load in
the same session. I can save and load in the same session.
If I close the application and open the application again and try to load
the saved(serialized) file, it is throwing an Archive Exception.

I am trying this for a game that I am working on so as to save and load in
different sessions.

Code:

-----------------------------------------------------------------------
#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/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>

/////////////////////////////////////////////////////////////
// gps coordinate
//
// illustrates serialization for a simple type
//
class gps_position
{
private:
friend class boost::serialization::access;
// When the class Archive corresponds to an output archive, the
// & operator is defined similar to <<. Likewise, when the class Archive
// is a type of input archive the & operator is defined similar to >>.
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & degrees;
ar & minutes;
ar & seconds;
}
int degrees;
int minutes;
float seconds;
public:
gps_position(){};
gps_position(int d, int m, float s) :
degrees(d), minutes(m), seconds(s)
{}
void gps_display()
{
std::cout << "\n Displaying....\n";
std::cout << degrees << " "<< minutes << " "<< seconds<<std::endl;
}
};

int main() {
// create and open a character archive for output
std::ofstream ofs("filename");

// create class instance
const gps_position g(35, 59, 24.567f);
gps_position newg;

char ch;

std::cout << "Enter an option\n 1. Save\n 2. Load\n 3. Display\n\n";

std::cin >> ch;
switch(ch)
{
case '1':
{
// save data to archive

boost::archive::text_oarchive oa(ofs);
// write class instance to archive
oa << g;
// archive and stream closed when destructors are called

}
break;

case '2':
{
// ... some time later restore the class instance to its orginal state
// create and open an archive for input

std::ifstream ifs("filename", std::ios::binary);
boost::archive::text_iarchive ia(ifs);
// read class state from archive
ia >> newg;
// archive and stream closed when destructors are called

}
break;

case '3':
newg.gps_display();
break;
default: std::cout << "\nInvalid option\n";
}
return 0;
}
-----------------------------------------------------------------------

Can we load a serialized file from the same program in a different session?

-- 
Thanks & Regards
------------------------------
Tejaswin G Macharla
-----------------------------


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net