Здравствуйте, Pavel Anufrikov, Вы писали:
PA>Можно ли красиво сериализовать boost::any с помощью boost::serialize?
напиши реализацию неинтрузивной сериализации для boost::any, в которой свичём пройдись по всем возможным типам, которые у тебя может содержать boost::any
Здравствуйте, Sni4ok, Вы писали:
PA>>Можно ли красиво сериализовать boost::any с помощью boost::serialize? S>напиши реализацию неинтрузивной сериализации для boost::any, в которой свичём пройдись по всем возможным типам, которые у тебя может содержать boost::any
Вот не хочу так делать. Нужно архитектурно правильное решение.
Здравствуйте, Pavel Anufrikov, Вы писали:
PA>Вот не хочу так делать. Нужно архитектурно правильное решение.
а об архиектурно правильном решении — вы поздно задумались — в тот момент, когда код написан, и необходимо лишь сериализовать состояние.
просто изначально не стоило использовать boost::any в обьекте- который подлежит сериализации(поскольку чисто гипотетически
в boost::any может находиться абсолютно что угодно, а в плюсах обьекты не умеют изначально сериализоваться), вместо boost::any нужно был юзать самый обычный полиморфный интерфейс изначально требующий к наследникам уметь сериализовать своё состояние.
Здравствуйте, Pavel Anufrikov, Вы писали:
PA>Можно ли красиво сериализовать boost::any с помощью boost::serialize?
Попробуйте реализовать свой SerializableAny как обёртку над boost::any. Т. е. сделайте такой Any, чтобы в него можно было помещать только serializable типы. Цепочку any_cast'ов использовать не придётся. Можно по аналогии со StreamableAny.
S>а об архиектурно правильном решении — вы поздно задумались — в тот момент, когда код написан, и необходимо лишь сериализовать состояние.
Нет еще никакого кода
S>просто изначально не стоило использовать boost::any в обьекте- который подлежит сериализации(поскольку чисто гипотетически S>в boost::any может находиться абсолютно что угодно, а в плюсах обьекты не умеют изначально сериализоваться),
Сомнительное утверждение. Например std::pair можно сериализовать. При попытке сделать это компилятор потребует "умение сериализоваться" от объектов, из которых она (пара) составлена.
S>вместо boost::any нужно был юзать самый обычный полиморфный интерфейс изначально требующий к наследникам уметь сериализовать своё состояние.
Динамический полиморфизм использовать только из-за сериализации не хочется. Объекты — это простые структуры данных, которые ни данные не скрывают, ни функционал не содержат.
Кстати, boost::variant, вроде бы, умеет сериализовываться. М.б. я не правильно выбрал boost::any(?)
Здравствуйте, Pavel Anufrikov, Вы писали:
S>>просто изначально не стоило использовать boost::any в обьекте- который подлежит сериализации(поскольку чисто гипотетически S>>в boost::any может находиться абсолютно что угодно, а в плюсах обьекты не умеют изначально сериализоваться),
PA>Сомнительное утверждение. Например std::pair можно сериализовать. При попытке сделать это компилятор потребует "умение сериализоваться" от объектов, из которых она (пара) составлена.
Ну дык std::pair можно сериализовать потому что есть такой код:
namespace boost {
namespace serialization {
// pairtemplate<class Archive, class F, class S>
inline void serialize(
Archive & ar,
STD::pair<F, S> & p,
const unsigned int/* file_version */
){
// note: we remove any const-ness on the first argument. The reason is that
// for stl maps, the type saved is pair<const key, T). We remove
// the const-ness in order to be able to load it.typedef BOOST_DEDUCED_TYPENAME boost::remove_const<F>::type typef;
ar & boost::serialization::make_nvp("key", const_cast<typef &>(p.first));
ar & boost::serialization::make_nvp("val", p.second);
}
} // serialization
} // namespace boost
и никакой магии.
А чего ты собссно ждёшь от any ? Там же голый указатель неизвестно на что. По любому придётся как-то научить сериализатор различать типы объектов по указателю, или как-то явно указать в компайлтайме.
В справке по serialization есть раздел "Pointers to Objects of Derived Classes". Там предлагается таки сделать иерархию полиморфных объектов, но никакого особого кода не требуется, достаточно просто сделать виртуальный деструктор, лишь бы RTTI добавилась. После этого можно будет сериализовать объекты через указатель на базовый класс:
If the base class is polymorphic, an object of the most derived type (derived_one or derived_two in this case) will be serialized. The question of which type of object is to be serialized is (almost) automatically handled by the library.