Будет ли Boost.Serialization работать напрямую с виртуальным наследованием алмазов?

Я впервые смотрю на 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 должным образом сериализованы и десериализованы, наряду с текущим классом сериализуется.

6

Решение

При сериализации объектов с виртуальными базовыми классами вам придется явно включить отслеживание объектов для виртуальных базовых классов:

BOOST_CLASS_TRACKING(virtual_base, boost::serialization::track_always)

От отслеживание объекта:

В структуре алмазного наследования с виртуальным базовым классом отслеживание объектов предотвратит избыточные вызовы сохранения / загрузки. Итак, вот один случай, когда было бы удобно переопределить черту отслеживания по умолчанию. (Примечание: в будущей версии значение по умолчанию будет переопределено для автоматического отслеживания классов, используемых в качестве виртуальных баз).

Что касается де / сериализации базовых классов, используйте:

archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base_class);

перед сериализацией переменных-членов (archive & BOOST_SERIALIZATION_NVP(variable)) с навязчивая сериализация. За ненавязчивый Сериализация зависит от вас, чтобы иметь дело со всеми задействованными переменными-членами.

Все это основано на предположении, что вы / сериализуете неполиморфный класс (с виртуальными базовыми классами) через указатель или ссылку на наиболее производный тип.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector