Сериализация сообщений
Обновлен: Ноябрь 2007
Сериализация — это процесс получения объекта и преобразования информации о его состоянии в форму, пригодную для хранения и передачи. Основная идея сериализации заключается в том, что объект записывает свое текущее состояние, которое, как правило, определяется значением его переменных-членов, в постоянное хранилище. Впоследствии объект может быть воссоздан путем чтения, или десериализации, состояния объекта из данного хранилища. При сериализации обрабатываются все детали указателей объекта и циклические ссылки объекта, которые используются в процессе его сериализации.
В контексте очередей сообщений под сериализацией понимается преобразование объекта или набора данных в сообщение, которое может быть отправлено в очередь, и последующее преобразование полученного из очереди сообщения обратно в объект или набор данных, которые могут быть обработаны приложением.
Модуль форматирования отвечает за сериализацию сообщений в приложениях Visual Studio или .NET Framework. При отправке сообщения в очередь модуль форматирования сериализует объект в поток, который может быть отправлен в очередь сообщений. При чтении из очереди модуль форматирования десериализует информацию сообщения в свойство Body.
Для данных, подлежащих отправке и получению, выбирается соответствующий тип модуль форматирования. В Visual Studio и .NET Framework предусмотрено три встроенных форматера, каждый из которых предназначен для архивации и разархивации разных типов данных:
Объект XmlMessageFormatter преобразует объекты и простые типы данных в сообщения и из сообщений, используя строки XML, которые можно легко прочитать без использования специальных программ. По умолчанию компоненты MessageQueue используют этот модуль форматирования.
Объект BinaryMessageFormatter преобразует один или несколько соединенных объектов в сериализованные потоки. В результате получаются компактные, быстроанализируемые потоки, но их невозможно прочитать без использования специальных программ.
Объект ActiveXMessageFormatter обрабатывает простые типы данных, обеспечивая совместимость с компонентами, которые используются предыдущими версиями систем очередей сообщений. Результаты сериализации очень компактны. Этот модуль форматирования разработан для приложений Windows, и результаты его работы невозможно прочитать без использования специальных программ. Однако это очень быстрый метод сериализации.
По умолчанию при создании экземпляра компонента MessageQueue создается объект XmlMessageFormatter и связывается с данным экземпляром. При вызове метода Send в экземпляре MessageQueue текст сообщения сериализуется с помощью данного модуля форматирования. Для использования модуля форматирования во время операции отправки никакого дополнительного кода писать не нужно.
Процесс чтения сообщения несколько сложнее. Для чтения сообщения из очереди при помощи модуля форматирования необходимо задать свойства, определяющие способ обработки текста сообщения. При использовании объекта XmlMessageFormatter задается свойство TargetTypes или TargetTypeNames. В случае использования объекта BinaryMessageFormatter задается другой набор свойств. Объект ActiveXMessageFormatter не имеет никаких связанных свойств. Дополнительные сведения см. в разделе Чтение и получение сообщений.
Помимо использования модулей форматирования, предоставляемых Visual Studio и .NET Framework, можно создать свои собственные форматеры, если требуется обработка других типов данных. Можно импортировать модуль форматирования в проект и обращаться к нему через код.
Нужный модуль форматирования можно выбрать, задав свойство Formatter для используемой очереди, сообщения или компонента MessageQueue.
Преимущества XML-форматирования сообщений
Одно из преимуществ модуля форматирования XML заключается в возможности чтения строк, создаваемых при сериализации данных или объекта. Это означает, что если по какой-то причине сообщение станет недоступным для разархивации из очереди сообщений, можно будет посмотреть на само сообщение и даже, возможно, решить проблему.
Еще одно преимущество заключается в том, что сообщения, сериализованные при помощи этого модуля форматирования, не обязательно должны быть десериализованы этим же модулем. То есть приложение-адресат не обязательно должно иметь модуль форматирования того же класса, что и приложение-отправитель, поскольку обоим приложениям известна структура данных. Кроме того, сообщения, сериализованные при помощи модуля форматирования XML, можно вообще не десериализировать. Большинство обозревателей и других программ для просмотра XML-файлов обладают возможностями анализа сообщений, имеющих формат XML.
См. также
Задачи
Практическое руководство. Создание экземпляров компонента MessageQueue