so_4: Версия 4.4.0. Ручная сериализация полей сообщений с помощью oess_1::io

Введение

Версии SObjectizer до 4.4.0 позволяли использовать в качестве полей сообщений глобальных агентов (т.е. полей, которые будут сериализоваться через SOP) поля элементарных типов (т.к. char, int, float, double, std::string) и типов, производных от oess_1::stdsn::serializable_t (т.е. поддерживающих oess_1::stdsn сериализацию). Такое положение вещей оказалось слишком жестким при попытке использовать SObjectizer совместно с другими объектными библиотеками (например, такими как wxWidgets), в которых есть собственные классы для многих фундаментальных понятий (таких как строки). Подобные классы невозможно сделать производными от oess_1::stdsn::serializable_t и при создании сообщений глобальных агентов требовалось применять какие-то ухищрения для преобразования данных в формат, понимаемый SObjectizer-ом.

В версии 4.4.0 в SObjectizer добавлена возможность использовать в качестве полей сообщений глобальных агентов поля типов, для которых определены операторы сдвига в oess_1::io::ostream_t и из oess_1::io::istream_t (т.е. для типов, которые поддерживают ручную oess_1::io сериализацию).

Использование

Для того, чтобы включить в сообщение глобавльного агента сериализуемое вручную поле необходимо:

Это все. Остальную работу будет брать на себя SObjectizer.

Например, передача объекта типа wxRect через SOP может осуществляться следующим образом. Сначала определяются операторы сдвига для wxRect:

oess_1::io::ostream_t &
operator<<( oess_1::io::ostream_t & s, const wxRect & r )
{
  return ( s << r.GetX() << r.GetY() << r.GetWidth() << r.GetHeight() );
}

oess_1::io::istream_t &
operator>>( oess_1::io::istream_t & s, wxRect & r )
{
  int x, y, w, h;
  s >> x >> y >> w >> h;
  r = wxRect( x, y, w, h );
  return s;
}
Затем описывается сообщение, полями которого будут объекты типа wxRect:
class a_some_global_agent_t : public so_4::rt::agent_t
{
public :
  struct msg_target_area_changed
  {
    wxRect  m_new_area;
    ...
  };
  ...
};
После чего поле msg_target_area_changed::m_new_area специальным образом описывается для SObjectizer:
SOL4_CLASS_START( a_some_global_agent_t )
  SOL4_MSG_START( msg_target_area_changed,
      a_some_global_agent_t::msg_target_area_changed )
    SOL4_MSG_FIELD_OESS_IO_CUSTOM( m_new_area )
    ...
  SOL4_MSG_FINISH()
  ...
SOL4_CLASS_FINISN()

Предупреждение

Ручная oess_1::io сериализация добавлена в SObjectizer из-за необходимости упростить интеграцию SObjectizer с другими объектными библиотеками. Тем не менее, при использовании ручной сериализации есть очень большая вероятность попасть в одну из следующих ловушек:

Подобные проблемы решаются в oess_1::stdsn сериализации, поэтому следует отдавать предпочтение именно oess_1::stdsn сериализации сложных объектов. А ручную oess_1::io сериализацию использовать только для типов, модификация которых не возможна (как в случае с классами из wxWidgets).

Примеры

Примеры использования ручной сериализации можно увидеть в примерах sample/filter/c1i.hpp, sample/filter/c1i.cpp, sample/filter/c2i.hpp, sample/filter/c2i.cpp.

Документация по SObjectizer v.4.4 'Тебуломста'. Последние изменения: Thu Sep 18 10:26:48 2008. Создано системой  doxygen1.5.6 Intervale SourceForge.net Logo