Надежная поддержка :: вариант сериализации - PullRequest
1 голос
/ 08 ноября 2011

Я использую boost::variant и boost::serialize в моем приложении.Модуль сериализации имеет встроенную поддержку вариантов сериализации, поэтому:

boost::variant<int,double> u(3.14);

// Do something with u;

// Serialize
oa << u;

работает.Однако моя проблема в том, что сериализация не является надежной.В зависимости от того, как скомпилировано мое приложение, элементы варианта могут измениться.В настоящее время модуль сериализации, по-видимому, просто внедряет индекс типа «активный» вариант;что является проблемой, если вариант был изменен, скажем, на boost::variant<double,string>.

Может кто-нибудь предложить способы улучшить это, чтобы сериализация / несериализация работала так, чтобы тип, который был сериализован, был параметром шаблонаиз boost::variant.(Таким образом, в приведенном выше случае boost::variant<int,double> u(3.14) может быть не сериализовано до boost::variant<double,std::string>. Я знаю, что для этого может потребоваться предоставить дополнительную информацию, такую ​​как строковая форма типа.

1 Ответ

3 голосов
/ 08 ноября 2011

Как будет работать готовый механизм для такой вещи? Например, что делать, если вы изменили boost::variant<int,double> на boost::variant<int,std::string> и больше не можете удерживать двойное число? Бросить исключение?

Если вы хотите что-то подобное, я бы подумал, что вам придется написать это самостоятельно, чтобы охватить ожидаемые вами случаи и соответствовать вашему определению «надежный».

Вы также можете встроить некоторую логику обновления файлов ... например, каждая версия N вашей программы хранит старые копии определений структур для (N-1, N-2 ...), так что вы возможность писать подпрограммы, которые можно использовать, предлагая возможность обновить старые файлы, с которыми он сталкивается.

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

...