Повысить сериализацию: как выбрать версию во время выполнения? - PullRequest
2 голосов
/ 18 апреля 2011

Я использую Boost Serialization , чтобы сериализовать элементы данных для передачи из одного компонента в другой. В документации обсуждается, как использовать механизм версий классов для десериализации как старых, так и новых версий класса .

Мой вариант использования немного отличается. В некоторых случаях более новая версия кода будет отправлять объекты в более старую версию. Старая версия не будет иметь нового определения, и поэтому она не сможет использовать этот механизм для чтения новой версии. Вместо этого я хотел бы программно установить обратно версию класса Boost и сгенерировать старую версию класса при подключении к более старым клиентам. Проблема в том, что кажется, что версия установлена ​​во время компиляции как статическая константа.

Могу ли я сделать это с помощью инструментов, предоставляемых Boost, или мне нужно добавить свою собственную информацию о версии в каждый экземпляр класса?

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

Нет никакого способа динамически влиять на версию типа, используемую Boost.Serialization, так как это постоянная времени компиляции (как вы упомянули). Вам нужно будет добавить собственную схему управления версиями для этого конкретного случая.

1 голос
/ 27 ноября 2017

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

Есть патч для boost xml архива, который пропустит новые неизвестные поля. Таким образом вы получите прямую совместимость при добавлении новых членов класса.

Другой - 3-й участник Архив дерева . Он хранит данные для boost :: property_tree :: ptree, которые вы можете записать как json. Он будет игнорировать неизвестные новые поля при загрузке.

Можно получить прямую совместимость из коробки в Протокол буфера

...