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

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

Теперь мы хотим изменить некоторые из их полей-членов на property, чтобы мы могли использовать их в 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 с управляемыми классами?

Изменить:

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

    ...
    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


person Sayyid    schedule 31.10.2010    source источник
comment
Возникает ли проблема, когда свойство удаляется (но класс остается классом ссылки)?   -  person CiscoIPPhone    schedule 31.10.2010
comment
Можете ли вы вместо этого использовать сериализацию .NET? C++ и C++-cli ​​— это не один и тот же язык. Хотя они могут до некоторой степени смешиваться, boost предназначен для C++, а не для C++-cli.   -  person Merlyn Morgan-Graham    schedule 31.10.2010
comment
@CiscolPPhone: Да, он все еще остается. @Merlyn Morgan-Graham: Нет, мы должны использовать boost:serialization в основном коде (в родном C++), этот код является лишь инструментом для основной программы.   -  person Sayyid    schedule 31.10.2010
comment
Какая версия буста? В этой строке check.hpp может быть описание. Вы также можете задать свой вопрос на странице news.gmane.org/gmane.comp. .lib.boost.пользователь.   -  person Andrew Hundt    schedule 01.12.2010
comment
Спасибо doomdayx, но я уже спрашивал там и не получил четкого ответа (только этот комментарий: Неизвестно, могут ли они работать с управляемыми классами, но точно знаю, что Managed C++ имеет МНОГО шаблонов проблемы и вообще не работает с "настоящим" кодом C++.) О версии: здесь используется boost 1.42.   -  person Sayyid    schedule 07.12.2010
comment
@Sayyid: Ну, мое предложение такое же, как у Мерлина ... Я бы использовал классы сериализации .NET. При программировании на vc++ вы можете получить доступ к основным классам .NET, которые позволяют вам получить доступ ко многим функциям... библиотека boost была бы бесполезна... Я понимаю, что, вероятно, ваша проблема связана с переносом, и что вы хотели бы перекомпилировать свой существующая программа в vc++, но это не так просто. vc++ не то же самое, что c++, у них другой синтаксис, другой способ управления наследованием и виртуальными таблицами... все меняется... это как спросить: могу ли я преобразовать свое приложение в паскаль?   -  person Andry    schedule 14.01.2011
comment
Я пишу код как на C++, так и на C++ Cli в течение длительного времени в большом проекте. По моему опыту, не пишите код с использованием пространства имен boost в проектах C++ Cli. Особенно boost::serialization.   -  person ali_bahoo    schedule 16.03.2011
comment
Я просто предполагаю, но вы могли бы сделать это, реализовав свои собственные глобальные перегрузки operator<< и operator>>, взяв ссылки на управляемые классы, которые служат адаптерами для версий Boost.   -  person Tim Sylvester    schedule 29.03.2011


Ответы (1)


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

person Seth    schedule 01.04.2011