2010-10-31 2 views
7

Wir haben viele native C++ - Klassen, die unter Verwendung von boost :: serialization perfekt serialisiert werden.Ist es möglich, boost :: serialization mit einer verwalteten Klasse zu verwenden?

Jetzt wollen wir einige ihrer Mitgliederfelder zu Eigenschaft ändern, so konnten wir sie in PropertyGrids verwenden. Wenn wir die Klasse definiction zu ref Klasse X verändert, haben wir eine große Anzahl dieser Kompilierungsfehlern:

# 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

Wir haben eine Menge winzige Klassen hier, also wäre es ein Schmerz, für jeden einen Wrapper zu schreiben! Hier

ist die Beispielklasse wir verwenden:

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; 
}; 

Und hier ist der Haupttestcode:

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; 
} 

Ist es sogar möglich, boost :: Serialisierung mit verwalteten Klassen zu benutzen?

Edit:

Wenn wir die Klasse Verwendungscode, um diese Änderung:

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

dann bekommen wir nur 1 Fehler:

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

+0

Tritt das Problem weiterhin auf, wenn die Eigenschaft entfernt wird (aber die Klasse bleibt eine ref-Klasse)? – CiscoIPPhone

+2

Können Sie stattdessen .NET-Serialisierung verwenden? C++ und C++ - CLI sind nicht die gleiche Sprache. Obwohl sie sich bis zu einem gewissen Grad vermischen können, ist Boost für C++, nicht für C++ - CLI. –

+0

@CiscolPPhone: Ja, es bleibt immer noch. @Merlyn Morgan-Graham: Nein, wir müssen Boost: Serialisierung im Hauptcode (in nativem C++) verwenden, dieser Code ist nur ein Werkzeug für das Hauptprogramm. – Sayyid

Antwort

0

Ich weiß, Sie sagten, Sie Ich möchte nicht alle deine Klassen einpacken. Anstatt jedoch alle Ihre Klassen in C++/CLI einzubetten, kann es sich lohnen, eine nicht verwaltete C++ - DLL zu entwickeln und alle relevanten Funktionen verfügbar zu machen. Sie können dann P/Invoke verwenden, um Ihre nicht verwaltete DLL aus verwaltetem Code (z. B. C++/CLI) aufzurufen. Nicht sicher, ob das machbar wäre.