Monday, October 29, 2007

Serializacja w C++

Serializowanie to metoda na zapisanie pełnego stanu naszej klasy.

class samochod {
void zapisz (ofstream & s); // Metoda przyjmuje wyjściowy strumień plikowy jako parametr
void odtworz(ifstream & const s); // stały: bo nie zmianiamy jego zawartości
}

void Samochod::zapisz (ofstream & s) {
s << marka << endl;
s << rejestracja << endl;
}

Klasa typu POD:
-> Nie ma konstruktora
-> Nie jest wirtualna
-> Nie ma elementów składowych innych niż stanadrowe (nie może być string, vector itd...)

Jeżeli klasa nie jest typu POD wtedy nie da się zapisać jej za pomocą "adres -> sizeof(class)" ponieważ posiada elementy dynamiczne.

#include

void Samochod::odtworz (ifstream & s) {
getline(s, marka);
getline(s, rejestracja);
}

main() {
ifstream s("plik.txt");
s.open("plik.txt");

s.close
// Tutaj samo się zamknie (robi to destruktor)
}

4 comments:

Anonymous said...

To co robi ten kod nazywasz serialiazacja? Dla mnie to klasyczny zapis danych do pliku...poczytaj co znaczy serializowac obiekt i pozniej popraw ten kod, bo jeszcze ktos sie nabierze. Pozdrawiam

Johny JKJK said...

http://www.parashift.com/c++-faq-lite/serialization.html#faq-36.1

Jak widać jednak jest to serializacja - Oni się nie mylą :]

Halfdan said...

Albo się mylą, albo źle dobrali słowa. Serializacja jest wtedy, gdy obiekt klasy zamieniasz na ciąg bitów jeszcze w pamięci komputera, po to żeby potem w łatwy sposób zapisać ten ciąg do pliku lub przesłać przez sieć. Chodzi o to żeby nie martwić się o kolejność zapisywanych składowych klasy tylko zamienić na ciąg, zapisać jako ciąg, potem ten ciąg wczytać i z powrotem zamienić na obiekt i kożystać z jego składowych. Jak wyczytałem w wiki, w c++ serializacja nie występuje bez użycia specjalnej, zewnętrznej biblioteki. Aczkolwiek można jako tako zserializować obiekt po prostu rzutując go na tablicę charów. Ale to nastręcza sporo kłopotów. Niestety muszę zgodzić się z "Anonimem" z 27 lutego, choć nie podoba mi się jego zadzieranie nosa...

Anonymous said...

Widzisz, w serializacji mógłbyś spokojnie wstawiać dynamiczne obiekty.
One w jakiś cudowny sposób zostają zapamiętane. Najgorsze że Cpp nie ma wsparcia jak PHP do procesu serializacji. Trzeba się namęczyć by bardziej zaawansowaną klasę do pliku zapisać.