2010-12-02 6 views
4

boost::serialization способен сериализовать мои полиморфные объекты их самого производного класса, даже если эти объекты указываются ссылкой/указателем на базовый класс. Это не требует виртуальных функций.Как работает boost :: serialization Archive :: register_type?

Для этого boost::serialization требует знать о существующих полиморфных типах: Archive::register_type необходимо называть объект Archive, используемый для сериализации.

This example показывает, как регистрировать типы и как их сериализовать.


Мне интересно, как это достигается.
Я попытался посмотреть исходный код boost::serialization, но не смог: я не так хорош с метапрограммированием шаблонов.

ответ

2

boost.serialization может написать свой полиморфный класс, используя либо typeid() или некоторые определенные пользователем функции get_key, которая возвращает фактический тип полиморфного объекта.

register_type работает, используя тип, поставляемый для создания экземпляра шаблона, который позволяет отображать архив идентификатор типа (либо typeid(T) или результат T::get_key()) к объекту, который знает, как сериализовать T.

1

boost :: serialization использует функции RTTI C++ для динамического определения типа объекта.

Вы можете посмотреть "typeid" функцию, чтобы определить динамический тип класса, даже имея только указатель базового класса.

http://en.wikibooks.org/wiki/C++_Programming/RTTI

+0

Да, я догадался, что RTTI были использованы, но как это делает register_type? – peoro 2010-12-02 16:55:10