2009-03-20 10 views
6

Używam Boost.Serialization do archiwizowania zawartości klasy. Jedną ze zmiennych składowych jest statyczne std :: vector.Statyczne elementy i serializacja wzmocnienia

Archiwizacja i przywracanie są w porządku, ale miałem nadzieję, że biblioteka uratuje statyczne elementy tylko raz, wydaje się, że, sądząc po pliku, statyczne elementy są w pełni zapisane dla każdej zarchiwizowanej instancji.

Łatwo to obejść, używając set/getters dla wektora statycznego i serializując wektor statyczny poza klasą raz.

Ale wolałbym mieć samodzielną klasę. Czy istnieje prosty i łatwy sposób, aby jednorazowo zarchiwizować statyczną zawartość klasy?

Odpowiedz

2

Serializuj wektor statyczny przed serializowaniem wszystkich wystąpień klasy.

Jeśli wektor takiego ty serializacji:

template<class Archive> 
void serialize(Archive & ar, const unsigned int version) 
{ 
    ar & this->someVar; 
    ar & this->AnotherVar; 
    ar & staticVector; 
} 

przekonany, statyczne wektor robi się w odcinkach z każdej instancji.

Jeśli potrzebujesz dodatkowych wyjaśnień, opublikuj swoją funkcję serialize i funkcję, która ją wywołuje.

+1

Nie sądzę, że jest tak "pewny", aby być szczerym. Ponieważ instancja statyczna rezyduje pod tym samym adresem pamięci dla każdej instancji klasy, miałem nadzieję, że biblioteka jakoś to odbierze i będzie na tyle mądra, aby nie zapisywać wektora za każdym razem, gdy plik jest zapisywany. – Pieter

+0

Serializowanie wektora, a następnie wszystkich instancji, jest "łatwo ominięte", o którym mówiłem, ponieważ powiedziałem, że wolałbym mieć własną serię() dla mojej klasy ... Ale jeśli to nie może zrobić serializowanie wektora najpierw jest to, co ja też będę trzymać oczywiście (tak to teraz działa ...) – Pieter

+0

To jest na pewno, Boost serializuje to, co mówisz, żeby serializować, bez względu na jego lokalizację pamięci, nie może tak dziko odgadnąć . Gdzie byłaby przechowywana sekcja statyczna, gdyby w jakiś sposób działała magicznie? Na początku, na końcu, w środku? Jednym ze sposobów byłoby użycie flagi takiej jak "serial". – arul

1

mam bardzo ograniczone doświadczenie z Boost.Serialization, więc proszę wziąć pod uwagę, co następuje odpowiednio:

IIRC, zabieg, który ma na swoim członka statycznego jest to, co odbywa się ze wskaźnikami. Więc może serializowanie wskaźnika do statycznego elementu zadziała.

Samokrytycyzm: Nie jestem pewien, w jaki sposób można to zastosować w przypadku serializacji.

Powiązane problemy