Для преодоления данных сложностей в ObjESSty v.1.4.0 была добавлена возможность использования ручной (custom) сериализации пользовательских типов.
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 > { ... // Реализация. }; } }
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( Some_User_NS::Some_User_Class )