Je recommande fortement d'utiliser Boost::serialization comme la plupart des gens suggèrent ici. J'ai, cependant, écrit un jouet exemple pour un ami qui était curieux de savoir comment vous le feriez sans coup de pouce. Je vais juste coller le programme complet ici.
Il ne gère pas la profondeur de la copie, ou la reconstitution de références, ou de l'une de ces autres considérations que vous auriez de puzzle (qui Boost::serialization a déjà fait).
Parce que c'est un jouet projet que je viens de faire les choses publiques. Vous voulez avoir l'encapsulation dans vos classes réelles qui peuvent exiger que les demandes d'amitié exploitants et de fournir la bonne accesseurs aux membres internes.
Sérialiser/Désérialiser Exemple
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
struct Contents {
int id;
char chr;
Contents(int id, char chr):id(id),chr(chr){}
};
std::ostream& operator<<(std::ostream &out, const Contents &me){
out << "Id: " << me.id << " Chr: " << me.chr;
return out;
}
typedef Contents Container_Value_Type;
const Container_Value_Type defaultBad = Contents(-1, '!');
const size_t Container_Vector_Size = 4;
struct Container{
std::vector<Container_Value_Type> data;
Container():data(Container_Vector_Size, defaultBad){}
void serialize( std::ostream &stream ) const {
for( size_t i = 0; i < Container_Vector_Size; ++i){
stream.write( reinterpret_cast <const char*> ( &data[i] ), sizeof( Container_Value_Type ) );
}
}
void deserialize( std::istream &stream ) {
data.clear();
std::vector<char> buffer(sizeof(Container_Value_Type));
for( size_t i = 0; i < Container_Vector_Size; ++i){
stream.read(&buffer[0], sizeof(Container_Value_Type));
data.push_back(*reinterpret_cast<Container_Value_Type*>(&buffer[0]));
}
}
};
std::stringbuf& operator<<(std::stringbuf &stream, Container &me) {
std::istream ibuffer(&stream);
me.deserialize(ibuffer);
return stream;
}
std::stringbuf& operator>>(std::stringbuf &stream, const Container &me) {
std::ostream obuffer(&stream);
me.serialize(obuffer);
return stream;
}
std::ostream& operator<<(std::ostream &stream, const Container &me) {
stream << "Container {" << std::endl;
for( size_t i = 0; i < Container_Vector_Size; ++i){
stream << i << ": " << me.data[i] << std::endl;
}
stream << "}" << std::endl << std::endl;
return stream;
}
int main(){
Container start;
start.data[0].id = 1;
start.data[0].chr = 'a';
start.data[1].id = 2;
start.data[1].chr = 'b';
start.data[2].id = 3;
start.data[2].chr = 'c';
start.data[3].id = 4;
start.data[3].chr = 'd';
Container reached;
std::stringbuf buffer;
buffer >> start;
buffer << reached;
std::cout << start;
std::cout << reached;
}