2009-03-20 2 views
6

Я использую Boost.Serialization для архивирования содержимого класса. Одной из переменных-членов является статический std :: vector.статические элементы и сериализация boost

Архивирование и восстановление идет хорошо, но я надеялся, что библиотека сохранит статические члены только один раз, кажется, что, судя по размеру файлов, статические члены полностью сохраняются для каждого архивированного экземпляра.

Это довольно легко обойти с помощью set/getters для статического вектора и сериализации статического вектора вне класса один раз.

Но я предпочел бы иметь самостоятельный класс. Есть ли простой и простой способ для архивирования статического содержимого класса только один раз?

ответ

2

Сериализуйте статический вектор перед сериализацией всех экземпляров класса.

Если вы сериализации вектор вроде этого:

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

Тогда уверен, статический вектор имеет получить сериализации с каждым экземпляром.

Если вам нужны дополнительные разъяснения, отправьте serialize функцию и функцию, которая ее вызывает.

+1

Я не думаю, что это так «конечно», если честно. Поскольку статический экземпляр находится в одном адресе памяти для каждого экземпляра класса, я надеялся, что библиотека каким-то образом его подберет и будет достаточно умна, чтобы каждый раз не писать вектор. – Pieter

+0

Сериализация вектора сначала, а затем все экземпляры, это «легко обойти», о котором я говорил, так как я сказал, что предпочел бы иметь собственный сериализованный() для моего класса ... Но если это не может сделайте сериализацию вектора во-первых, это то, что я буду придерживаться тоже, конечно (вот как это работает сейчас ...) – Pieter

+0

Уверен, Boost сериализует то, что вы говорите, для сериализации, независимо от его местоположения в памяти, он не может этого удивлять , Где бы хранился статический раздел, если это каким-то волшебным образом сработало? В начале, в конце, посередине? Один из способов - использовать флаг «сериализованный». – arul

1

У меня очень ограниченный опыт Boost.Serialization, поэтому, пожалуйста, подумайте, что следует соответствующим образом:

IIRC, лечение вы хотите для вашего статического члена является то, что делается с указателями. Поэтому может произойти сериализация указателя на статический член.

Самокритика: Я не уверен, как это можно применить при де-сериализации.

Смежные вопросы