Бөлісу құралы:


XmlMessageFormatter Класс

Определение

Сериализует и десериализирует объекты в текст сообщения или из текста сообщения, используя формат XML на основе определения схемы XSD.

public ref class XmlMessageFormatter : ICloneable, System::Messaging::IMessageFormatter
public class XmlMessageFormatter : ICloneable, System.Messaging.IMessageFormatter
type XmlMessageFormatter = class
    interface IMessageFormatter
    interface ICloneable
Public Class XmlMessageFormatter
Implements ICloneable, IMessageFormatter
Наследование
XmlMessageFormatter
Реализации

Примеры

В следующем примере кода содержится три фрагмента кода: серверный компонент, класс заказа и клиентский код. Класс order может использоваться программой XSD.exe для создания схемы, распознаваемой сервером в входящих сообщениях. Схема представляет собой XML-форматированный файл, описывающий "фигуру" класса. Затем эту схему можно использовать на стороне клиента для создания класса заказов для конкретного клиента, который использует ту же схему, что и класс сервера.

В следующем примере кода представлен серверный компонент, который получает заказы через очередь сообщений. Текст сообщения должен быть объектом порядка, схема которого соответствует классу Order.cs ниже. Серверный процесс или десериализация приложения выполняет десериализацию заказа.

#using <System.dll>
#using <System.Messaging.dll>

using namespace System;
using namespace System::Messaging;

// placeholder; see complete definition elsewhere in this section
public ref class Order
{
public:
   void ShipItems(){}

};


// Creates the queue if it does not already exist.
void EnsureQueueExists( String^ path )
{
   if (  !MessageQueue::Exists( path ) )
   {
      MessageQueue::Create( path );
   }
}

int main()
{
   Console::WriteLine( "Processing Orders" );
   String^ queuePath = ".\\orders";
   EnsureQueueExists( queuePath );
   MessageQueue^ queue = gcnew MessageQueue( queuePath );
   array<String^>^temp0 = {"Order"};
   (dynamic_cast<XmlMessageFormatter^>(queue->Formatter))->TargetTypeNames = temp0;
   while ( true )
   {
      Order^ newOrder = dynamic_cast<Order^>(queue->Receive()->Body);
      newOrder->ShipItems();
   }
}
using System;
using System.Messaging;

 public class Server{

     public static void Main(){

         Console.WriteLine("Processing Orders");

         string queuePath = ".\\orders";
         EnsureQueueExists(queuePath);
         MessageQueue queue = new MessageQueue(queuePath);
         ((XmlMessageFormatter)queue.Formatter).TargetTypeNames = new string[]{"Order"};

         while(true){
             Order newOrder = (Order)queue.Receive().Body;
             newOrder.ShipItems();
         }
     }

     // Creates the queue if it does not already exist.
     public static void EnsureQueueExists(string path){
         if(!MessageQueue.Exists(path)){
             MessageQueue.Create(path);
         }
     }
 }
Imports System.Messaging



Public Class Server
    
    
    Public Shared Sub Main()
        
        Console.WriteLine("Processing Orders")
        
        Dim queuePath As String = ".\orders"
        EnsureQueueExists(queuePath)
        Dim queue As New MessageQueue(queuePath)
        CType(queue.Formatter, XmlMessageFormatter).TargetTypeNames = New String() {"Order"}
        
        While True
            Dim newOrder As Order = CType(queue.Receive().Body, Order)
            newOrder.ShipItems()
        End While
    End Sub
    
    
    ' Creates the queue if it does not already exist.
    Public Shared Sub EnsureQueueExists(path As String)
        If Not MessageQueue.Exists(path) Then
            MessageQueue.Create(path)
        End If
    End Sub
End Class

В следующем примере кода представлен класс заказа, который предоставляет схему для объектов заказа, которые приложение на сервере получает и десериализирует.

using namespace System;
public ref class Order
{
public:
   int itemId;
   int quantity;
   String^ address;
   void ShipItems()
   {
      Console::WriteLine( "Order Placed:" );
      Console::WriteLine( "\tItem ID  : {0}", itemId );
      Console::WriteLine( "\tQuantity : {0}", quantity );
      Console::WriteLine( "\tShip To  : {0}", address );
      
      // Add order to the database.
      /* Insert code here. */
   }

};
using System;

 public class Order{

     public int itemId;
     public int quantity;
     public string address;

     public void ShipItems(){

         Console.WriteLine("Order Placed:");
         Console.WriteLine("\tItem ID  : {0}",itemId);
         Console.WriteLine("\tQuantity : {0}",quantity);
         Console.WriteLine("\tShip To  : {0}",address);

         // Add order to the database.
         /* Insert code here. */
     }
 }
Public Class Order
    
    Public itemId As Integer
    Public quantity As Integer
    Public address As String
    
    
    Public Sub ShipItems()
        
        Console.WriteLine("Order Placed:")
        Console.WriteLine(ControlChars.Tab & "Item ID  : {0}", itemId)
        Console.WriteLine(ControlChars.Tab & "Quantity : {0}", quantity)
        Console.WriteLine(ControlChars.Tab & "Ship To  : {0}", address)

        ' Add order to the database.
        ' Insert code here.
 
    End Sub
End Class

Любое клиентское приложение, взаимодействующее с приложением на сервере, должно отправлять сообщения на сервер путем сериализации сведений в локально определенном классе порядка в текст сообщения. Локально определенный класс порядка должен иметь ту же схему, что и класс порядка, определенный сервером, в котором приложение на сервере попытается десериализировать текст сообщения. Служебная программа XSD.exe позволяет руководителю приложения на сервере создавать и распространять схему, используемую клиентом для сериализации сообщений, поступающих на сервер.

Когда диспетчер клиентского приложения получает схему для класса заказа, программа XSD.exe используется снова для создания класса заказа для конкретного клиента из схемы. Это класс, используемый в приведенном ниже примере клиентского кода, а не класс заказа сервера (служебная программа XSD.exe приводит к тому, что созданный схемой класс будет иметь то же имя, что и исходный класс). Этот новый класс порядка используется для сериализации порядка в текст сообщения.

В следующем примере кода используется клиентская обработка, используемая для сериализации заказа и отправки сведений, связанных с заказом в очередь. Код связывает сведения об элементе, количестве и адресе с элементами схемы, созданной для класса Order.cs служебной программой XSD.exe. Заказ отправляется в очередь заказов на локальном компьютере.

#using <System.dll>
#using <System.Messaging.dll>

using namespace System;
using namespace System::Messaging;

// placeholder; see complete definition elsewhere in this section
public ref class Order
{
public:
   int itemId;
   int quantity;
   String^ address;
   void ShipItems(){}

};


// Creates the queue if it does not already exist.
void EnsureQueueExists( String^ path )
{
   if (  !MessageQueue::Exists( path ) )
   {
      MessageQueue::Create( path );
   }
}

int main()
{
   String^ queuePath = ".\\orders";
   EnsureQueueExists( queuePath );
   MessageQueue^ queue = gcnew MessageQueue( queuePath );
   Order^ orderRequest = gcnew Order;
   orderRequest->itemId = 1025;
   orderRequest->quantity = 5;
   orderRequest->address = "One Microsoft Way";
   queue->Send( orderRequest );
   
   // This line uses a new method you define on the Order class:
   // orderRequest.PrintReceipt();
}
using System;
using System.Messaging;

 class Client{

     public static void Main(){

         string queuePath = ".\\orders";
         EnsureQueueExists(queuePath);
         MessageQueue queue = new MessageQueue(queuePath);

         Order orderRequest = new Order();
         orderRequest.itemId = 1025;
         orderRequest.quantity = 5;
         orderRequest.address = "One Microsoft Way";

         queue.Send(orderRequest);
         // This line uses a new method you define on the Order class:
         // orderRequest.PrintReceipt();
     }

     // Creates the queue if it does not already exist.
     public static void EnsureQueueExists(string path){
         if(!MessageQueue.Exists(path)){
             MessageQueue.Create(path);
         }
     }
 }
Imports System.Messaging

Class Client
    
    
    Public Shared Sub Main()
        
        Dim queuePath As String = ".\orders"
        EnsureQueueExists(queuePath)
        Dim queue As New MessageQueue(queuePath)
        
        Dim orderRequest As New Order()
        orderRequest.itemId = 1025
        orderRequest.quantity = 5
        orderRequest.address = "One Microsoft Way"
        
        queue.Send(orderRequest)
        ' This line uses a new method you define on the Order class:
        ' orderRequest.PrintReceipt()

    End Sub
    
    ' Creates the queue if it does not already exist.
    Public Shared Sub EnsureQueueExists(path As String)
        If Not MessageQueue.Exists(path) Then
            MessageQueue.Create(path)
        End If
    End Sub
End Class

После создания схемы из класса order на сервере можно изменить класс. Если схема не изменится, вам не нужно распространять схему. После распространения схемы и создания класса заказа на стороне клиента этот клиентский класс также можно изменить независимо от класса заказа сервера, если сама схема не изменяется. Два класса стали слабо связаны.

Комментарии

Это XmlMessageFormatter средство форматирования по умолчанию, используемое для сериализации сообщений, записанных MessageQueue в очередь. При создании экземпляра MessageQueueXmlMessageFormatter создается экземпляр для вас и связан с нимMessageQueue. Можно указать другой форматировщик, создав его в коде и назначив его свойству Formatter вашего MessageQueue.

Экземпляр очереди по умолчанию XmlMessageFormatter можно использовать для записи в очередь, но его нельзя использовать для чтения из очереди, пока не укажите TargetTypesTargetTypeNames или свойство в методе форматирования. Вы можете задать одно или оба этих значения в экземпляре форматирования по умолчанию или создать новый экземпляр модуля форматирования и настроить их автоматически, передав их в качестве аргументов в соответствующий XmlMessageFormatter конструктор.

При указании TargetTypes , а не TargetTypeNamesво время компиляции проверяется существование типа, а не во время чтения, что снижает вероятность возникновения ошибки. TargetTypeNames требует, чтобы каждая запись была полной, указывая ее имя сборки. Кроме того, при работе с несколькими параллельными версиями номер версии также должен быть добавлен к имени целевого типа.

TargetTypes Свойства TargetTypeNames сообщают методу форматирования, какие схемы следует пытаться сопоставить при десериализации сообщения. Это позволяет форматировщику интерпретировать текст сообщения.

Экземпляр, сериализованный в тексте сообщения, должен соответствовать одной из схем, представленных в массиве типов. При чтении сообщения с помощью Receive метода метод создает объект типа, соответствующего определенной схеме, и считывает текст сообщения в него.

При чтении из очереди необходимо задать только одно из двух свойств, но их можно задать. Набор типов — это объединенный набор из двух свойств. Решение о том, какое свойство следует использовать, зависит от приложения. Если текст сообщения содержит тип, схема которого не соответствует ни одному из типов в массиве для любого свойства, при чтении сообщения будет возникать исключение.

Это XmlMessageFormatter важный компонент слабо связанного обмена сообщениями на основе XML. Программа XSD.exe использует формат XML для создания XML-схемы, например при использовании служебной программы для сериализации класса, используемого приложением. Класс должен содержать конструктор без параметров.

Формат снова используется в обратном процессе, когда программа создает класс на основе схемы, распространяемой для описания данных класса. Использование служебной программы и xml-схемы, которая она создает, позволяет избежать redistributing.dll файлов при повторной компиляции класса после изменения реализации класса. Если схема не изменяется на клиенте или сервере, другие изменения на обеих сторонах не влияют на другие.

Конструкторы

Имя Описание
XmlMessageFormatter()

Инициализирует новый экземпляр XmlMessageFormatter класса без набора целевых типов.

XmlMessageFormatter(String[])

Инициализирует новый экземпляр XmlMessageFormatter класса, устанавливая целевые типы, передаваемые в виде массива (полных) строковых значений.

XmlMessageFormatter(Type[])

Инициализирует новый экземпляр XmlMessageFormatter класса, устанавливая целевые типы, передаваемые в виде массива типов объектов.

Свойства

Имя Описание
TargetTypeNames

Задает набор возможных типов, которые будут десериализированы методом форматирования из предоставленного сообщения.

TargetTypes

Задает набор возможных типов, которые будут десериализированы методом форматирования из предоставленного сообщения.

Методы

Имя Описание
CanRead(Message)

Определяет, может ли средство форматирования десериализировать сообщение.

Clone()

Создает экземпляр XmlMessageFormatter класса, свойства чтения и записи (наборы целевых типов) совпадают с текущим XmlMessageFormatter экземпляром.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
Read(Message)

Считывает содержимое данного сообщения и создает объект, содержащий десериализированное сообщение.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)
Write(Message, Object)

Сериализует объект в текст сообщения.

Применяется к

См. также раздел