Partilhar via


XmlMessageFormatter Classe

Definição

Serializa e desserializa objetos para ou do corpo de uma mensagem, usando o formato XML baseado na definição de esquema 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
Herança
XmlMessageFormatter
Implementações

Exemplos

O exemplo de código a seguir inclui três partes de código: um componente de servidor, uma classe de pedido e um código do cliente. A classe order pode ser usada pelo utilitário XSD.exe para gerar o esquema que o servidor reconhece em mensagens de entrada. O esquema é um arquivo formatado em XML que descreve a "forma" da classe . Esse esquema pode então ser usado no lado do cliente para gerar uma classe de pedido específica do cliente que compartilha o mesmo esquema que a classe de servidor.

O exemplo de código a seguir representa um componente de servidor que recebe pedidos por meio de uma fila de mensagens. O corpo da mensagem deve ser um objeto de ordem cujo esquema corresponde à classe Order.cs abaixo. O processo do servidor ou aplicativo desserializa a ordem.

#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

O exemplo de código a seguir representa a classe de pedido que fornece um esquema para os objetos de ordem que o aplicativo no servidor recebe e desserializa.

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

Qualquer aplicativo cliente que interage com o aplicativo no servidor deve enviar mensagens para o servidor serializando informações em uma classe de ordem definida localmente no corpo da mensagem. A classe de ordem definida localmente deve ter o mesmo esquema que a classe de ordem definida pelo servidor na qual o aplicativo no servidor tentará desserializar o corpo da mensagem. O utilitário XSD.exe permite que o gerente do aplicativo no servidor crie e distribua o esquema que o cliente deve usar para serializar mensagens que vão para o servidor.

Quando o gerente do aplicativo cliente recebe o esquema da classe de pedido, o utilitário XSD.exe é usado novamente para gerar uma classe de pedido específica do cliente do esquema. É essa classe usada no exemplo de código do cliente abaixo, não a classe de pedido do servidor (o utilitário XSD.exe faz com que a classe gerada por esquema tenha o mesmo nome que a classe original). Essa nova classe de pedido é usada para serializar a ordem no corpo da mensagem.

O exemplo de código a seguir é o processamento do lado do cliente, usado para serializar um pedido e enviar as informações associadas ao pedido para uma fila. O código associa informações de Item, Quantidade e Endereço a elementos do esquema que foram gerados para a classe Order.cs pelo utilitário XSD.exe. Um pedido é enviado para a fila Pedidos no computador local.

#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

Depois que o esquema for gerado a partir da classe de pedido no servidor, você poderá modificar a classe . A menos que o esquema seja alterado, você não precisará redistribuir o esquema. Depois de distribuir o esquema e gerar uma classe de pedido do lado do cliente, essa classe de cliente também pode ser modificada independentemente da classe de pedido do servidor, desde que o esquema em si não seja modificado. As duas classes se tornaram vagamente acopladas.

Comentários

O XmlMessageFormatter é o formatador padrão que uma instância do MessageQueue usa para serializar mensagens gravadas na fila. Quando você cria uma instância de MessageQueue, uma instância de XmlMessageFormatter é criada para você e associada ao MessageQueue. Você pode especificar um formatador diferente criando-o em seu código e atribuindo-o Formatter à propriedade de seu MessageQueue.

A instância padrão XmlMessageFormatter de uma fila pode ser usada para gravar na fila, mas não pode ser usada para ler da fila até que você defina a TargetTypes propriedade ou TargetTypeNames no formatador. Você pode definir um ou ambos os valores na instância de formatador padrão ou criar uma nova instância do formatador e definir os valores automaticamente passando-os como argumentos para o construtor apropriado XmlMessageFormatter .

Ao especificar em vez de TargetTypesTargetTypeNames, a existência do tipo é verificada em tempo de compilação em vez de tempo de leitura, reduzindo a possibilidade de erro. TargetTypeNames requer que cada entrada seja totalmente qualificada, especificando seu nome de assembly. Além disso, ao trabalhar com várias versões simultâneas, o número de versão também deve ser acrescentado ao nome do tipo de destino.

As TargetTypeNames propriedades e TargetTypes informam ao formatador quais esquemas tentar corresponder ao desserializar uma mensagem. Isso permite que o formatador interprete o corpo da mensagem.

A instância serializada no corpo da mensagem deve estar em conformidade com um dos esquemas representados na matriz de tipos. Quando você lê a mensagem usando o Receive método , o método cria um objeto do tipo que corresponde ao esquema identificado e lê o corpo da mensagem nele.

Apenas uma das duas propriedades precisa ser definida ao ler da fila, mas você pode definir ambas. O conjunto de tipos é o conjunto combinado das duas propriedades. A decisão de qual propriedade usar é específica para seu aplicativo. Se o corpo da mensagem contiver um tipo cujo esquema não corresponde a nenhum dos tipos na matriz de nenhuma das propriedades, uma exceção será gerada quando a mensagem for lida.

O XmlMessageFormatter é um componente crucial de mensagens baseadas em XML acopladas livremente. O utilitário XSD.exe usa o formato XML é usado para gerar esquema XML, como quando você usa o utilitário para serializar uma classe usada pelo aplicativo. A classe deve ter um construtor sem parâmetros.

O formato é usado novamente no processo inverso quando o utilitário gera uma classe com base no esquema que você distribui para descrever seus dados de classe. O uso do utilitário e do esquema XML gerados permite evitar redistributing.dll arquivos sempre que você recompilar uma classe após a alteração da implementação da classe. Desde que o esquema não seja alterado no cliente ou no servidor, outras alterações em ambos os lados não afetam a outra.

Construtores

XmlMessageFormatter()

Inicializa uma nova instância da classe XmlMessageFormatter, sem tipos de destino definidos.

XmlMessageFormatter(String[])

Inicializa uma nova instância da classe XmlMessageFormatter, definindo os tipos de destino passados como uma matriz de valores de cadeia de caracteres (totalmente qualificados).

XmlMessageFormatter(Type[])

Inicializa uma nova instância da classe XmlMessageFormatter, definindo tipos de destino transmitidos como uma matriz de tipos de objeto.

Propriedades

TargetTypeNames

Especifica o conjunto de tipos possíveis que serão desserializados pelo formatador da mensagem fornecida.

TargetTypes

Especifica o conjunto de tipos possíveis que serão desserializados pelo formatador da mensagem fornecida.

Métodos

CanRead(Message)

Determina se o formatador pode desserializar a mensagem.

Clone()

Cria uma instância da classe XmlMessageFormatter cujas propriedades de leitura/gravação (os conjuntos dos tipos de destino) são as mesmas que a instância XmlMessageFormatter atual.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetHashCode()

Serve como a função de hash padrão.

(Herdado de Object)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
Read(Message)

Lê o conteúdo de determinada mensagem e cria um objeto que contém a mensagem desserializada.

ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

(Herdado de Object)
Write(Message, Object)

Serializa um objeto no corpo da mensagem.

Aplica-se a

Confira também