Ускорьте десериализацию в динамические типы

По этой ссылке вы можете найти сериализацию boost и Десериализация. Но в методе десериализации нам нужно указать конкретный объект класса для десериализации. Пример: новый

gps_position newg;
{
    // create and open an archive for input
    std::ifstream ifs("filename");
    boost::archive::text_iarchive ia(ifs);
    // read class state from archive
    ia >> newg;
    // archive and stream closed when destructors are called
}

Поскольку в C++ нет базового класса, такого как Object в C#, как я могу десериализовать его в общий объект, а затем привести его к типу?

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


person Navin    schedule 24.10.2012    source источник


Ответы (2)


Boost.serialization должен иметь конкретный класс. Поскольку в С++ нет виртуальных конструкторов, десериализатор должен знать, какой объект создавать. Общий предок тоже не поможет. Объекты должны быть созданы до десериализации.

Если вы хотите сериализовать и десериализовать иерархии классов, вы должны явно написать идентификатор класса при сериализации объектов, а при десериализации — явно прочитать этот идентификатор, чтобы принять решение — какой объект создать и десериализовать.

person Evgeny Lazin    schedule 24.10.2012
comment
но даже для того, чтобы прочитать идентификатор, мне нужно сначала его десериализовать, а затем снова десериализовать до этого типа, не так ли? - person Navin; 24.10.2012
comment
Я не думаю, что ускоренная сериализация была разработана для работы с динамическими иерархиями объектов. Может быть, я не прав. - person Evgeny Lazin; 24.10.2012

Вы можете десериализовать в базовый класс, если вы сериализуете/десериализуете указатели на объекты. Затем Boost автоматически создает идентификатор и т. д. Механизм описан здесь

person eyck    schedule 06.08.2013