Можно ли использовать boost :: serialization с управляемым классом? - PullRequest
7 голосов
/ 31 октября 2010

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

Теперь мы хотим изменить некоторые из их полей-членов на свойство , чтобы мы могли использовать их в PropertyGrids . Когда мы изменили определение класса на ref class 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;
}

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

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

1 Ответ

0 голосов
/ 01 апреля 2011

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

...