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..
:)