2012-10-24 2 views
1

In this link Vous pouvez trouver la surenchère Boerization et la désérialisation. Mais dans la méthode de désérialisation, nous devons désérialiser l'objet spécifique de la classe. Ex: newgBoostez la désérialisation en types dynamiques

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 
} 

Depuis C++ ne marche pas avoir une classe de base comme objet en C#, comment puis-je désérialiser dans un objet commun puis cataloguée il?

Dans la mesure où je ne le fais pas, je peux créer un objet d'appel de classe personnalisée et hériter de toutes les autres classes, mais même dans ce cas, il y aura une situation à désérialiser 2 fois. Y a-t-il une solution de contournement pour ce problème?

Répondre

2

La sérialisation de Boost doit être classée en béton. Puisque C++ n'a pas de constructeur virtuel, le deserializer doit savoir quel objet créer. Un ancêtre commun ne va pas aider non plus. L'objet doit être créé avant la désérialisation. Si vous souhaitez sérialiser et désérialiser les hiérarchies de classes, vous devez écrire explicitement l'ID de classe lors de la sérialisation des objets et lors de la désérialisation - lire explicitement cet ID pour prendre une décision - quel objet créer et désérialiser.

+0

mais même pour lire l'ID je dois le désérialiser d'abord et puis de nouveau désérialiser à ce type n'est-ce pas? – Navin

+0

Je ne pense pas que la sérialisation boost ait été conçue pour fonctionner avec les hiérarchies d'objets dynamiques. Peut-être que je n'ai pas raison. – Lazin

+0

Merci l'homme .. Je regarde dedans .. – Navin

0

Vous pouvez désérialiser dans une classe de base si vous sérialiser/désérialiser des pointeurs vers des objets. Boost crée alors automatiquement l'Id etc. Le mécanisme est décrit here

Questions connexes