boost::serialize + boost::any
От: Pavel Anufrikov Россия  
Дата: 18.03.08 05:31
Оценка:
Можно ли красиво сериализовать boost::any с помощью boost::serialize?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: boost::serialize + boost::any
От: MindWrapper  
Дата: 19.03.08 14:43
Оценка:
Здравствуйте, Pavel Anufrikov, Вы писали:

PA>Можно ли красиво сериализовать boost::any с помощью boost::serialize?


Думаю, без any_cast никак, т.к. иначе в boost::any должет быть определен serialize
Re: boost::serialize + boost::any
От: Sni4ok  
Дата: 19.03.08 17:35
Оценка:
Здравствуйте, Pavel Anufrikov, Вы писали:

PA>Можно ли красиво сериализовать boost::any с помощью boost::serialize?


напиши реализацию неинтрузивной сериализации для boost::any, в которой свичём пройдись по всем возможным типам, которые у тебя может содержать boost::any
Re[2]: boost::serialize + boost::any
От: Pavel Anufrikov Россия  
Дата: 20.03.08 06:48
Оценка:
Здравствуйте, Sni4ok, Вы писали:

PA>>Можно ли красиво сериализовать boost::any с помощью boost::serialize?

S>напиши реализацию неинтрузивной сериализации для boost::any, в которой свичём пройдись по всем возможным типам, которые у тебя может содержать boost::any

Вот не хочу так делать. Нужно архитектурно правильное решение.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: boost::serialize + boost::any
От: Sni4ok  
Дата: 20.03.08 09:58
Оценка:
Здравствуйте, Pavel Anufrikov, Вы писали:

PA>Вот не хочу так делать. Нужно архитектурно правильное решение.


а об архиектурно правильном решении — вы поздно задумались — в тот момент, когда код написан, и необходимо лишь сериализовать состояние.
просто изначально не стоило использовать boost::any в обьекте- который подлежит сериализации(поскольку чисто гипотетически
в boost::any может находиться абсолютно что угодно, а в плюсах обьекты не умеют изначально сериализоваться), вместо boost::any нужно был юзать самый обычный полиморфный интерфейс изначально требующий к наследникам уметь сериализовать своё состояние.
Re: boost::serialize + boost::any
От: Qbit86 Кипр
Дата: 20.03.08 10:37
Оценка: 2 (1)
Здравствуйте, Pavel Anufrikov, Вы писали:

PA>Можно ли красиво сериализовать boost::any с помощью boost::serialize?


Попробуйте реализовать свой SerializableAny как обёртку над boost::any. Т. е. сделайте такой Any, чтобы в него можно было помещать только serializable типы. Цепочку any_cast'ов использовать не придётся. Можно по аналогии со StreamableAny.
Глаза у меня добрые, но рубашка — смирительная!
Re[4]: boost::serialize + boost::any
От: Pavel Anufrikov Россия  
Дата: 21.03.08 02:54
Оценка:
S>а об архиектурно правильном решении — вы поздно задумались — в тот момент, когда код написан, и необходимо лишь сериализовать состояние.

Нет еще никакого кода

S>просто изначально не стоило использовать boost::any в обьекте- который подлежит сериализации(поскольку чисто гипотетически

S>в boost::any может находиться абсолютно что угодно, а в плюсах обьекты не умеют изначально сериализоваться),

Сомнительное утверждение. Например std::pair можно сериализовать. При попытке сделать это компилятор потребует "умение сериализоваться" от объектов, из которых она (пара) составлена.

S>вместо boost::any нужно был юзать самый обычный полиморфный интерфейс изначально требующий к наследникам уметь сериализовать своё состояние.


Динамический полиморфизм использовать только из-за сериализации не хочется. Объекты — это простые структуры данных, которые ни данные не скрывают, ни функционал не содержат.
Кстати, boost::variant, вроде бы, умеет сериализовываться. М.б. я не правильно выбрал boost::any(?)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: boost::serialize + boost::any
От: Mazay Россия  
Дата: 21.03.08 16:02
Оценка: 2 (1)
Здравствуйте, Pavel Anufrikov, Вы писали:

S>>просто изначально не стоило использовать boost::any в обьекте- который подлежит сериализации(поскольку чисто гипотетически

S>>в boost::any может находиться абсолютно что угодно, а в плюсах обьекты не умеют изначально сериализоваться),

PA>Сомнительное утверждение. Например std::pair можно сериализовать. При попытке сделать это компилятор потребует "умение сериализоваться" от объектов, из которых она (пара) составлена.


Ну дык std::pair можно сериализовать потому что есть такой код:
namespace boost { 
namespace serialization {

// pair
template<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.

Главное гармония ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.