Я впервые смотрю на Boost.Serialization и не могу найти четкую оценку (или инструкции) относительно сериализации виртуальной структуры наследования алмазов.
Рассмотрим следующую иерархию классов:
class A { int a; }
class B1 : public virtual A { int b1; }
class B2 : public virtual A { int b2; }
class B3 : public virtual A { int b3; }
class C12 : public virtual B1, public virtual B2 { int c12; }
class C13 : public virtual B1, public virtual B3 { int c13; }
class C23 : public virtual B2, public virtual B3 { int c23; }
class D123 : public virtual C12, public virtual C13, public virtual C23 { int d123; }
Каков правильный (надеюсь, простой) способ реализации сериализации во всех этих классах с использованием Boost.Serialization?
Примечание. Нет указателей или членов ссылочного класса, которые необходимо сериализовать. Также обратите внимание: я счастлив использовать dynamic_cast<>
чтобы гарантировать, что любые указатели или ссылки на какие-либо классы в этой иерархии имеют требуемый, наиболее производный тип: я просто обеспокоен тем, как правильно и чисто гарантировать, что все члены данных класса BASE должным образом сериализованы и десериализованы, наряду с текущим классом сериализуется.
При сериализации объектов с виртуальными базовыми классами вам придется явно включить отслеживание объектов для виртуальных базовых классов:
BOOST_CLASS_TRACKING(virtual_base, boost::serialization::track_always)
В структуре алмазного наследования с виртуальным базовым классом отслеживание объектов предотвратит избыточные вызовы сохранения / загрузки. Итак, вот один случай, когда было бы удобно переопределить черту отслеживания по умолчанию. (Примечание: в будущей версии значение по умолчанию будет переопределено для автоматического отслеживания классов, используемых в качестве виртуальных баз).
Что касается де / сериализации базовых классов, используйте:
archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base_class);
перед сериализацией переменных-членов (archive & BOOST_SERIALIZATION_NVP(variable)
) с навязчивая сериализация. За ненавязчивый Сериализация зависит от вас, чтобы иметь дело со всеми задействованными переменными-членами.
Все это основано на предположении, что вы / сериализуете неполиморфный класс (с виртуальными базовыми классами) через указатель или ссылку на наиболее производный тип.
Других решений пока нет …