oess_1.4.0. Ручная сериализация пользовательских типов

См. также:
oess_1.4.0. Шаблоны ручной сериализации для STL контейнеров, oess_1.4.0. Готовые сериализации для пользовательских типов.

Введение

В некоторых случаях бывает необходимо сериализовать уже существующий пользовательский тип, который не является производным от oess_1::stdsn::serializable_t. Например, тип ACE_Date_Time, с которым возникают сразу две сложности:

Для преодоления данных сложностей в ObjESSty v.1.4.0 была добавлена возможность использования ручной (custom) сериализации пользовательских типов.

Внимание:
Механизмы ручной сериализации не являются заменой штатной сериализации ObjESSty oess_1::stdsn. Ручная сериализация предназначена для случаев, когда тип нельзя сделать сериализуемым с помошью штатных механизмов. Например, если тип входит в какую-то стороннюю библиотеку (вроде Qt, wxWidgets, ACE и др.).

Идея

Для сериализации объекта пользовательского типа во вспомогательном коде генерируется объект:
oess_1::stdsn::oobj_t< User_Type > oobj( ... );
а для десериализации:
oess_1::stdsn::iobj_t< User_Type > iobj( ... );

По умолчанию, шаблоны oess_1::stdsn::oobj_t<> и oess_1::stdsn::iobj_t<> вызывают сгенерированные вспомогательные методы для типа User_Type. Но для всех примитивных типов и для некоторых внутренних ObjESSty типов созданы специализации этих шаблонов.

Идея ручной сериализации состоит в том, что пользователь может самостоятельно реализовать специализацию шаблонов oess_1::stdsn::oobj_t<> и oess_1::stdsn::iobj_t<> для своего типа. Естественно, что располагаться эта специализация должна в пространстве имен oess_1::stdsn. Например:

namespace Some_User_NS
{

class Some_User_Class { ... };

}

// Теперь делаем специализацию ObjESSty шаблонов для Some_User_NS::Some_User_Class.
namespace oess_1
{

namespace stdsn
{

template<>
class oobj_t< Some_User_NS::Some_User_Class >
  {
  ... // Реализация.
  };

template<>
class iobj_t< Some_User_NS::Some_User_Class >
  {
  ... // Реализация.
  };

}
}

Ручная сериализация на практике

Явная специализация шаблонов oobj_t<> и iobj_t<> -- это не самое простое занятие. Кроме того, эта специализация может привязать прикладной код к текущей версии ObjESSty и, если в следующих версиях ObjESSty интерфейс oobj_t<> и iobj_t<> изменится, то предется изменять и реализацию сериализации. Что бы избежать лишних сложностей ObjESSty предлагает использовать на практике более простой путь.

Реализация операторов сдвига в oess_1::io::*stream_t

Для начала необходимо реализовать для своего типа операторы сдвига в oess_1::io::ostream_t и oess_1::io::istream_t. Например, вот так:
inline oess_1::io::ostream_t &
operator<<( oess_1::io::ostream_t & out, const Some_User_NS::Some_User_Class & d )
  {
    ... // Код по сдвигу объекта в out.
    return out;
  }

inline oess_1::io::istream_t &
operator>>( oess_1::io::istream_t & in, Some_User_NS::Some_User_Class & d )
  {
    ... // Код по сдвигу объекта из in.
    return in;
  }

Такие операторы сдвига автоматически позволяют сохранять/извлекать объекты пользовательского типа в любой поток из oess_1::io (что может оказаться полезным не только для stdsn-сериализации).

Использование макроса OESS_1_STDSN_SPECIALIZE_CUSTOM_TYPE

После того, как операторы сдвига в ObjESSty-потоки определены, достаточно воспользоваться макросом OESS_1_STDSN_SPECIALIZE_CUSTOM_TYPE(). Нужно только помнить, что использовать данный макрос нужно в глобальном пространстве имен.

OESS_1_STDSN_SPECIALIZE_CUSTOM_TYPE( Some_User_NS::Some_User_Class )

Заметки:
Нужно помнить, что в месте использования макроса OESS_1_STDSN_SPECIALIZE_CUSTOM_TYPE() должны быть видны операторы сдвига в ObjESSty-потоки.

Документация по ObjESSty. Последние изменения: Fri Oct 13 18:35:37 2006. Создано системой  doxygen 1.4.7
Hosted by uCoz