2010-10-31 3 views
7

У нас есть много родных классов C++, которые отлично сериализуются с использованием boost :: serialization.Можно ли использовать boost :: serialization с управляемым классом?

Теперь мы хотим изменить некоторые из своих полей членов собственности, чтобы мы могли использовать их в PropertyGrids. Когда мы изменили класс definiction к реф класса X, мы получили огромное количество этих ошибок компиляции:

# 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

У нас есть много здесь крошечные классы, поэтому было бы больно написать обертку для каждого из них!

Вот класс образца мы использовали:

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

А вот главный тестовый код:

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

ли даже можно использовать подталкивание :: сериализации с управляемыми классами?

Edit:

Если мы изменим код использования класса для этого:

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

тогда мы получим только 1 ошибка:

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

+0

Возникает ли проблема, когда свойство удаляется (но класс остается классом ref)? – CiscoIPPhone

+2

Вместо этого вы можете использовать сериализацию .NET? C++ и C++ - cli - не один и тот же язык. Хотя они могут в некоторой степени смешивать, boost для C++, а не C++ - cli. –

+0

@CiscolPPhone: Да, это все еще остается. @Merlyn Morgan-Graham: Нет, нам нужно использовать boost: сериализация в основном коде (в родном C++), этот код является только инструментом для основной программы. – Sayyid

ответ

0

Я знаю, что ты сказал, что ты не хотите обертывать все ваши классы. Однако вместо того, чтобы обертывать все ваши классы в C++/CLI, возможно, стоит разработать неуправляемую dll C++ и выставить все соответствующие функции. Затем вы можете использовать P/Invoke для вызова неуправляемой dll из управляемого кода (например, C++/CLI). Не уверен, что это будет возможно.

Смежные вопросы