Увеличете десериализацията в динамични типове

В тази връзка можете да намерите Boost Serialization и десериализация. Но в метода за десериализация трябва да дадем конкретния обект на класа за десериализация. Пример: newg

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 трябва да получи конкретен клас. Тъй като c++ няма виртуални конструктори, deserializer трябва да знае какъв обект да създаде. Общият прародител също няма да помогне. Обектът трябва да бъде създаден преди десериализацията.

Ако искате да сериализирате и десериализирате йерархии на класове, трябва изрично да напишете клас Id, когато сериализирате обекти и когато десериализирате - изрично прочетете този Id, за да вземете решение - какъв обект да създадете и десериализирате.

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