Ich serialisiere eine Klasse mit boost unter Verwendung von binary. Ich verwende ios::append, um mehrere Objekte an diese Datei anzuhängen. Wie gehe ich vor, um alle gespeicherten Objekte abzurufen?
Hier ist meine Testklasse, die eine mehrfache Serialisierung versucht und sie abruft. Ich habe den Fehlerpunkt kommentiert, an dem ich keine korrekten Daten erhalte.
using namespace std;
class Data {
public:
double get_latitude() const {
return _latitude;
}
double get_longitude() const {
return _longitude;
}
void set_latitude(double _latitude) {
this->_latitude = _latitude;
}
void set_longitude(double _longitude) {
this->_longitude = _longitude;
}
private:
double _latitude;
double _longitude;
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 & _latitude;
ar & _longitude;
}
};
class DataTest: public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE( DataTest);
CPPUNIT_TEST(testMultipleSaveData);
CPPUNIT_TEST_SUITE_END();
public:
void testMultipleSaveData() {
Data data;
data.set_latitude(1.0);
data.set_longitude(2.0);
saveData(data);
Data secondData;
secondData.set_latitude(5.0);
secondData.set_longitude(6.0);
saveData(secondData);
Data returnData;
Data return2Data;
{
// create and open an archive for input
std::ifstream ifs("data.dat", ios::binary);
boost::archive::binary_iarchive ia(ifs);
// read class state from archive
ia >> returnData;
ia >> return2Data;
// archive and stream closed when destructors are called
}
CPPUNIT_ASSERT_EQUAL(data.get_latitude(), returnData.get_latitude());
CPPUNIT_ASSERT_EQUAL(data.get_longitude(), returnData.get_longitude());
//Failure on next line
CPPUNIT_ASSERT_EQUAL(secondData.get_latitude(), return2Data.get_latitude());
CPPUNIT_ASSERT_EQUAL(secondData.get_longitude(), return2Data.get_longitude());
}
void saveData(Data data) {
std::ofstream ofs("data.dat", ios::binary | ios::app);
boost::archive::binary_oarchive oa(ofs);
oa << data;
}
};
CPPUNIT_TEST_SUITE_REGISTRATION( DataTest);