Zapisywanie obiektów do pliku - serializacja

0

Witam,

Ostatnio zacząłem uczyc sie o zapisie danych do plikow binarnych. Potrzebuje zapisać właśnie w takim pliku obiekt danej klasy. Dowiedziałem się tylko, że trzeba napisać metody serializacji i deserializacjii i że aby to zrobić trzeba znać rozmiar tego co się chce zapisać.
Wszystko, co udało mi sie znaleŹć na ten temat to użycie czegoś o nazwie boost, przy czym potrzebuje stworzyć to możliwie 'ręcznie', bez użycia gotowych bibliotek.

Tak wygląda klasa:

 
class MojeZadanie
{
public:
    MojeZadanie(){} //konstruktor domyślny
    ~MojeZadanie(){} //destruktor
    MojeZadanie(int numer, int data, string tresc, int datawykonania, int priorytet, int obrazek); //konstruktor

    //pola
    int numer;
    int data;
    string tresc;
    int datawykonania;
    int priorytet;
    int obrazek;

MojeZadanie *next; //wskaźnik na nastepny element
MojeZadanie *prev; //wskaźnik na poprzedni element

};

Sprawdziłem sizeof tej klasy - 32 (z tym że wskaźniki wskazują na dwa takie same obiekty... czyli chyba jeszcze 2x24 ... :/ )
Co się jeszcze dowiedziałem, to to że (podobno) najlepiej jest użyć czegoś w rodziaju buforu w tablicy dynamicznej, a co do wskaźników to trzeba dołożyć do serializacji to, na co wskazują.

Prosiłbym o pomoc, chociaż jak się za to zabrać i ew. w miarę możliwości wyjaśnienie ogólnej zasady działania takiego mechanizmu :)
Pozdrawiam,

0

Okej to tak, spróbowałem na razie z użyciem zwykłego strumienia i pętli while żeby po prostu zapisywał kolejne obiekty, na razie z jednym tylko polem i problem jest taki, że owszem, przy zapisie zapisuje po kolei wszystkie elementy, lecz przy wczytaniu (też pętla while, miała tworzyć obiekty i wpisywać do nich pole) wczytuje wszystkie na raz do jednego obietku :/ (np. jak na zapisie mam 5 elementów z wartościami kolejno 1 2 3 4 , to po wczytaniu tworzy jeden element z wartością 1234)

Starałem się zrobić coś podobnego jak ktoś z innego forum mi poradził:

Wskaznik wskazuje na jakies miejsce w pamieci gdzie w tej chwili cos sie znajduje, co nie znaczy ze edzie sie to tam znajdowalo za jakis zas, a juz na pewno nie bedzie tam tego przy nastepnym starcie aplikacji:) Czytaj - Nie serializuj wskaznikow.

Powinienes napsiac metode ktora zapisuje binarnie wszystkie parametry klasy, a nastepnie uzywajac parametr next przechodzi do nastepnego elementu listy.
Przy odczycie sprawdzasz eof, jesli nie to tworzysz instancje klasy, wczytujesz parametry i ustawiasz wskazniki.

Zakladajac ze dzialasz na liscie dwukierunkowej i zapisujesz elementy tylko jednego typu to moze to wygladac jakos tak:

void save(serializer& s)
{
  MojeZadanie* z=root;
  while(z)
  {
    s<<z->numer;
    s<<z->data;;
   //...
    z=z->next;
  }
}
void loadserializer& s)
{
  while(!s.eof())
  {
     MojeZadanie* z= new MojeZadanie;
     s>>z->numer;
     s>>z->data;
     ///......
     if(!root)
        root=tail = z;
     else
     {
         tail->next = z;
         z->prev = tail;
     }
  }
}
0

Może zacznij od obejrzenia jak to robią inni: http://www.boost.org/doc/libs/1_47_0/libs/serialization/example/demo.cpp

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