Я попытался внимательно прочитать все советы, приведенные в C++FAQ на эту тему. Я внедрил свою систему в соответствии с пунктом 36.8 и теперь, спустя несколько месяцев (с большим количеством сериализуемых данных), я хочу внести изменения как в общий интерфейс некоторых классов, так и в структуру наследования.Как выполнить гибкую сериализацию полиморфной иерархии наследования?
class Base
{
public:
Vector field1() const;
Vector field2() const;
Vector field3() const;
std::string name() const {return "Base";}
};
class Derived : public Base
{
public:
std::string name() const {return "Derived";}
};
Я хотел бы знать, как сделать такие изменения, как:
Split
Derived
вDerived1
иDerived2
, в то время как отображение исходнойDerived
вDerived1
для существующих данных.Split
Base::field1()
вBase::field1a()
иBase::field1b()
в то время как отображениеfield1
вfield1a
и сfield1b
пустой для существующих данных.
мне придется
- десериализации все гигабайты моих старых данных
- преобразовать их в новую структуру наследования
- reserialize их в новом и более гибко.
Я хотел бы знать как сделать сериализации более гибким, так что, когда я решил сделать некоторые изменения в будущем, я не был бы лицом преобразования в ад, как сейчас.
Я думал о создании системы, которая использовала бы цифры вместо имен для сериализации моих объектов. Это, например, Base = 1, Derived1 = 2, ... и отдельная номер-к-имени система, которая конвертирует числа в имена, так что когда я хочу изменить имя какого-либо класса, я бы делайте это только в этой отдельной системе номер-имени, не меняя данные.
Проблемы, связанные с этим подходом являются:
Система будет хрупкими. То, что меняет что-либо в системе номер-к-имени, может изменить смысл гигабайт данных.
Сериализованные данные потеряют некоторые из его человеко-читаемость, так как в сериализованных данных вместо имен будут цифры.
Я извиняюсь за то, так много вопросов в один вопрос, но я неопытный в программировании и проблема я столкнулся кажется настолько подавляющим, что я просто не знаю, с чего начать.
Любые общие материалы, учебники, идиомы или литература по гибкой сериализации наиболее приветствуются!
Вам не нужны номера для имен или преобразование имен в число. Вы хотите, чтобы программные сущности (типы, поля) были сопоставлены именам (внешним, сериализуемым). Имена, данные этим объектам в исходном коде, не совсем актуальны. Вы можете использовать имена источников в качестве внешних имен по умолчанию, но должна быть возможность переопределить это. –
Отображение не обязательно должно быть 1: 1, вы можете написать 'class NewWidget' как« NewWidget », но прочитать« Виджет »и« NewWidget »как« класс NewWidget ». Кроме того, если поле имеет разумное значение по умолчанию, вы просто используете его, когда его значение не встречается в сериализованных данных. Таким образом, вы можете вводить новые поля без особых проблем. Это автоматически покрывает 90% ваших потребностей. –
Для остальных 10 процентов вам потребуется написать код конверсии. Просто никогда не удаляйте старые классы и поля из вашего кода. Напишите для них процедуры пост-десериализации, которые преобразуют их в новые объекты. –