2011-12-02 3 views
3

Можно создать дубликат:
Boost Serialization using polymorphic archivesПовышение Сериализации с помощью базового указателя на производный класс

Я пытаюсь сериализации своих классов с использованием базового указателя на производный класс, но упорядочивает только базовый класс.

Я только что прочитал http://www.boost.org/doc/libs/1_32_0/libs/serialization/doc/special.html#registration, но и макрос экспорта, и функция регистрации ничего не изменили.

Рассмотрим следующее, очень простой, иерархия классов:

#include <iostream> 
#include <fstream> 
#include <boost/archive/binary_oarchive.hpp> 
#include <boost/archive/binary_iarchive.hpp> 

class A 
{ 
private: 
    friend class boost::serialization::access; 
    template <typename Archive> 
    void serialize(Archive& ar, const unsigned int version) 
    { 
    std::cout << "A!\n"; 
    } 
}; 

class B : public A 
{ 
private: 
    friend class boost::serialization::access; 
    template <typename Archive> 
    void serialize(Archive& ar, const unsigned int version) 
    { 
    ar & boost::serialization::base_object<A>(*this); 
    std::cout << "B!\n"; 
    } 
}; 

int main() 
{ 
    std::ofstream of("mybin.bin"); 
    boost::archive::binary_oarchive oa(of); 

    A* b = new B(); 
    oa << b; 

    delete b; 

    return 0; 
} 

выход будет:

А!

Очевидно, что результат, который я ищу, - это A! B !. Есть ли способ, которым это может быть достигнуто?

EDIT: Хорошо, посмотрев соответствующую запись в комментариях, вот что происходит.

Был 3 вещи, чтобы изменить:

  1. класса А должен иметь виртуальную функцию так, что она считается полиморфный
  2. необходимости экспортировать производные классы. BOOST_CLASS_EXPORT (Б)
  3. габаритная < < б вместо габаритная < < * б

Он работает со стандартным binary_oarchive, а также polymorphic_binary_oarchive.

EDIT2: Когда я допустим b.cpp (.h) и main.cpp, результаты BOOST_CLASS_EXPORT в дублированных символов:

дубликат символа подталкивание :: архив :: подробнее :: extra_detail: : init_guid :: г

+0

Должна ли функция сериализации быть «виртуальной»? – fefe

+0

См. Мое редактирование, все еще не работающее с полиморфным архиватором и boost_class_export. – vdsf

+1

@fefe: Нет такой функции, как функция виртуального шаблона. – vdsf

ответ

3

Я должен признать, что я не знаком с этим boost пакет, но я скопировал и компилируется код, который произвел тот же результат, что ОП упоминается

Понимая, что мы используем полиморфизм, Я добавил public: virtual ~A(){}; в class A. Кроме того, oa.register_type<B>(); добавляют в main в соответствии с документом, и выход стал:

A! 
B! 

Согласно спецификации, класс является polymorphic class только тогда, когда declares or inherits a virtual function. Для не-полиморфных классов, возможно, полиморфизм просто не работает.

EDIT:

Ввод BOOST_CLASS_EXPORT(B); в B.cpp вместо B.h, кажется, решить эту проблему переосмысления.

EDIT:

Проверено результатом расширения BOOST_CLASS_EXPORT(B) (переформатировать):

namespace boost { 
    namespace serialization { 
     template<> struct guid_defined<B> : boost::mpl::true_ {}; 
     template<> inline const char * guid<B>(){ return "B"; } 
    } 
} 
namespace boost { 
    namespace archive { 
     namespace detail { 
      namespace { // NOTE 
       template<> struct init_guid<B> { 
        static guid_initializer<B> const & g; 
       }; 
       guid_initializer<B> const & init_guid<B>::g = ::boost::serialization::singleton< guid_initializer<B> >::get_mutable_instance().export_guid(); 
      } 
     } 
    } 
} 

А для линии, помеченной NOTE: для повышения 1,42 используется анонимное пространство имен используется, что не будет никаких проблем если он помещается в несколько файлов cpp или помещается в заголовочный файл (тестируется в ubuntu с g ++, используя пакет boost вместе с Ubuntu). Тем не менее, в boost 1.48 используется namespace extra_detail, что может вызвать проблемы при вставке в несколько файлов cpp (проверено в Windows с VS2010, используя загрузку с начальной страницы).

+0

yep. Я это исправил. Дальнейшее исследование символа дублирования можно найти здесь: http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/traits.html#export. Используя два упомянутых макроса, удалили дубликат символа, но сбой serialiation. Исследуя. – vdsf

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

  • Нет связанных вопросов^_^