Serializacja vectora klasy X do pliku XML

0

Jest na to jakiś łatwy sposób w C++?
Przypuśćmy, że mamy

vector<myClass>;
MyClass
{
int a;
sting c;
enumType d;
};

W jaki sposób można serializować vector do pliku xml i deserializować do obiektu?
Będę wdzięczny za prostu kod implementujący funkcjonalnośc.

0

zakladajac ze masz:

funkcja znajdzNazweEnuma_enumType(enumType d)
switch d
case A return 'blah'
case B return 'bleh'
case X return 'bloh'
end

funkcja zabezpieczStringa ( string str )
str = str.replace ( "<", "<" )
str = str.replace ( ">", ">" )
str = str.replace ( "&", "&" )
str = str.replace ( """, """ )
str = str.replace ( "'", "'" )
.... i inne entities w ten sposob
return str
end

procedura serializuj_obiekt( ostream & output, MyClass const & obiekt)
output << "<MyClass>"
output << "" << obiekt.a << ""
output << "<c>" << zabezpieszStringa( obiekt.c )<< "</a>"
output << "<d>" << znajdzNazweEnuma_enumType(obiekt.d) << "</a>"
output << "</MyClass>"
end

to serializacja wektora jest banalna:

template<T> procedura "serializuj_std_vector" ( ostream& output, std vector <T> wektor )
output << "<std:vector param0="
output << """ << jakos_zgadnij_nazwe_jako_string<T>() << """
output << " length=" << wektor.size() << ">"
for const iterator it = wektor.begin, it != end, ++it
serializuj_obiekt( output, * it )
end

no, moze poza napisaniem ciala funkcji jakos_zgadnij_nazwe_jako_string<T>(), ale sadze, ze sobie poradzisz.
ah, pseudokod powyzej oczywiscie, ale w miare dokladny

deserializacja
w momencie znalezienia tagu std::vector
czytasz size oraz param0
fabryke vectorow z PARAM0
tworzysz deserializera PARAM0
odpalasz fabryke vectorow mowiac jej jaki SIZE, fabryke tworzy wektor SIZE elementowy, zawierajacy default-ctorowane obiekty typu PARAM0
SIZE razy odpalasz deserializera
deserializer PARAM0, czyli MyClass:
czyta tag, sprawdza nazwe, odczytuje pod-tagi a/c/d do jego wnetrza kolejnego-eleentu-z-wektora

jezeli zas MyClass moze byc klasa bazowa dla innych i ow wector moze trzymac subclassy:

  • nie vector myclass, tylko vector<myclass*> lub vector<myclass&>
  • deserializatora tworzysz na nowo per-kazdy-inner-tag-wektora
  • potrzebujesz nie jeden deserializer, ale tyle ile jest mozliwych subclass klasy MyClass
  • serializujac musisz sledzic czy przypadkiem w vectorze nie bylo tak, ze dwa jego indeksy pokazywaly ten sam obiekt fizyczny i musisz to zaznaczac. i deserializujac musisz to brac pod uwage i NIE tworzyc kopii, tylko odpowieni podwojny link do tego samego obiektu

to tak w skrocie..
:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1