2010-10-31 25 views
7

Nous avons beaucoup de classes C++ natives qui sont sérialisées parfaitement en utilisant boost :: serialization.Est-il possible d'utiliser boost :: serialization avec la classe managée?

Maintenant, nous voulons changer certains de leurs champs membres à propriété, pour que nous puissions les utiliser dans PropertyGrids. Lorsque nous avons changé la definiction de classe ref classe X, nous avons eu un grand nombre de ces erreurs de compilation:

# 1: error C2893: Failed to specialize function template 'boost::archive::text_oarchive &boost::archive::detail::interface_oarchive<Archive>::operator <<(T &)' d:\someAddress\someFile.cpp 58

# 2: error C2784: 'std::basic_ostream<_Elem,_Traits> &std::operator <<(std::basic_ostream<_Elem,_Traits> &,const std::_Smanip<_Arg> &)' : could not deduce template argument for 'std::basic_ostream<_Elem,_Traits> &' from 'boost::archive::text_oarchive' d:\someAddress\someFile.cpp 58

Nous avons beaucoup de minuscules classes ici, donc ce serait une douleur d'écrire un emballage pour chacun d'eux!

Voici la classe exemple, nous avons utilisé:

ref class gps_position2 
{ 
public: 
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & seconds; 
    } 
public: 
    gps_position(){}; 
    gps_position(float s) 
    { 
     this->seconds = s; 
    } 

    property float seconds; 
}; 

Et voici le code principal de test:

int main() 
{ 
    std::ofstream ofs("out.txt"); 

    gps_position2 g(24.567f); 

    // save data to archive 
    { 
     boost::archive::text_oarchive oa(ofs); 
     // write class instance to archive 
     oa << g; 
    } 
    // ................ 
    return 0; 
} 

Est-il même possible d'utiliser boost :: sérialisation avec des classes gérées?

Edit:

Si nous changeons le code d'utilisation de la classe à ceci:

... 
    gps_position2^ g = gcnew gps_position2(24.567f); 
    ... 

alors nous obtenons seulement 1 erreur:

error C2027: use of undefined type 'boost::STATIC_ASSERTION_FAILURE<x>' D:\path\to\Boost\boostw\boost\archive\detail\check.hpp 60

+0

Le problème persiste-t-il lorsque la propriété est supprimée (mais la classe reste une classe ref)? – CiscoIPPhone

+2

Pouvez-vous utiliser la sérialisation .NET à la place? C++ et C++ - cli ne sont pas le même langage. Bien qu'ils puissent se mélanger dans une certaine mesure, boost est pour C++, pas C++ - cli. –

+0

@CiscolPPhone: Oui, il reste encore. @Merlyn Morgan-Graham: Non, nous devons utiliser boost: sérialisation dans le code principal (en C++ natif), ce code n'est qu'un outil pour le programme principal. – Sayyid

Répondre

0

Je sais que vous avez dit que vous Je ne veux pas envelopper tous vos cours. Cependant, au lieu d'encapsuler toutes vos classes dans C++/CLI, il peut être intéressant de développer une DLL C++ non managée et d'exposer toutes les fonctions pertinentes. Vous pouvez ensuite utiliser P/Invoke pour appeler votre DLL non gérée à partir du code managé (par exemple C++/CLI). Je ne sais pas si cela serait faisable.