Sdílet prostřednictvím


XmlMessageFormatter Třída

Definice

Serializuje a deserializuje objekty do textu zprávy nebo z textu zprávy pomocí formátu XML na základě definice schématu 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
Dědičnost
XmlMessageFormatter
Implementuje

Příklady

Následující příklad kódu obsahuje tři části kódu: součást serveru, třídu objednávek a kód klienta. Třídu objednávek může použít nástroj XSD.exe ke generování schématu, které server rozpozná v rámci příchozích zpráv. Schéma je soubor ve formátu XML, který popisuje "tvar" třídy. Toto schéma lze pak použít na straně klienta k vygenerování třídy objednávky specifické pro klienta, která sdílí stejné schéma jako třída serveru.

Následující příklad kódu představuje součást serveru, která přijímá objednávky prostřednictvím fronty zpráv. Text zprávy by měl být objekt pořadí, jehož schéma odpovídá Order.cs třídě níže. Proces serveru nebo aplikace deserializuje pořadí.

#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

Následující příklad kódu představuje třídu objednávky, která poskytuje schéma pro objekty objednávky, které aplikace na serveru přijímá a deserializuje.

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

Každá klientská aplikace, která komunikuje s aplikací na serveru, musí odesílat zprávy na server serializací informací v místně definované třídě pořadí do textu zprávy. Místně definovaná třída objednávky musí mít stejné schéma jako třída pořadí definovaná serverem, do které se aplikace na serveru pokusí deserializovat tělo zprávy. Nástroj XSD.exe umožňuje správci aplikace na serveru vytvořit a distribuovat schéma, které klient musí použít k serializaci zpráv na serveru.

Když správce klientské aplikace obdrží schéma pro třídu objednávky, nástroj XSD.exe se znovu použije k vygenerování třídy objednávky specifické pro klienta ze schématu. Je to tato třída, která se používá v příkladu kódu klienta níže, ne třídy objednávek serveru (nástroj XSD.exe způsobí, že třída vygenerovaná schématem má stejný název jako původní třída). Tato nová třída objednávky slouží k serializaci pořadí do textu zprávy.

Následující příklad kódu je zpracování na straně klienta, které slouží k serializaci objednávky a odeslání informací přidružených k objednávce do fronty. Kód přidruží informace Item, Quantity a Address k prvkům schématu, které byly generovány pro třídu Order.cs nástrojem XSD.exe. Objednávka se odešle do fronty Objednávky v místním počítači.

#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

Po vygenerování schématu z třídy objednávky na serveru můžete upravit třídu. Pokud se schéma nezmění, nemusíte schéma redistribuovat. Po distribuci schématu a vygenerování třídy objednávky na straně klienta lze tuto třídu klienta upravit také nezávisle na třídě objednávek serveru, pokud samotné schéma není změněno. Dvě třídy se volně propojte.

Poznámky

Jedná se XmlMessageFormatter o výchozí formátovací modul, který instance MessageQueue používá k serializaci zpráv zapsaných do fronty. Při vytváření instance , je MessageQueuevytvořena instance XmlMessageFormatter je pro vás a přidružena k .MessageQueue Můžete zadat jiný formátovací modul tak, že ho vytvoříte v kódu a přiřadíte ho k Formatter vlastnosti vašeho MessageQueue.

Výchozí XmlMessageFormatter instanci fronty lze použít k zápisu do fronty, ale nelze ji použít ke čtení z fronty, dokud nenastavíte TargetTypesTargetTypeNames vlastnost nebo vlastnost ve formátovacím modulu. Můžete buď nastavit jednu nebo obě tyto hodnoty ve výchozí instanci formátovače, nebo můžete vytvořit novou instanci formátovače a nastavit hodnoty automaticky tak, že je předáte jako argumenty do příslušného XmlMessageFormatter konstruktoru.

Při zadávání TargetTypes namísto TargetTypeNames, existence typu je kontrolována v době kompilace namísto čtení času, což snižuje možnost chyby. TargetTypeNames vyžaduje, aby byla každá položka plně kvalifikovaná a zadala její název sestavení. Navíc při práci s více souběžnými verzemi musí být číslo verze také připojeno k názvu cílového typu.

Formátovací TargetTypeNames modul a TargetTypes vlastnosti říkají, jaká schémata se mají při deserializaci zprávy shodovat. Díky tomu může formátovací modul interpretovat text zprávy.

Instance serializovaná v textu zprávy musí splňovat jedno ze schémat reprezentovaných v poli typů. Při čtení zprávy pomocí Receive metody vytvoří metoda objekt typu, který odpovídá identifikovanému schématu a přečte do něj text zprávy.

Při čtení z fronty je potřeba nastavit pouze jednu ze dvou vlastností, ale obojí můžete nastavit. Sada typů je kombinovaná sada ze dvou vlastností. Rozhodnutí, kterou vlastnost použít, je specifická pro vaši aplikaci. Pokud text zprávy obsahuje typ, jehož schéma neodpovídá žádnému z typů v poli pro některou vlastnost, bude vyvolán výjimka při čtení zprávy.

Jedná se XmlMessageFormatter o klíčovou součást volně propojených zpráv založených na JAZYCE XML. Nástroj XSD.exe používá formát XML k vygenerování schématu XML, například při použití nástroje k serializaci třídy používané vaší aplikací. Třída musí mít konstruktor bez parametrů.

Formát se znovu použije v obráceném procesu, když nástroj vygeneruje třídu na základě schématu, které distribuujete za účelem popisu dat třídy. Použití nástroje a schématu XML, které generuje, umožňuje vyhnout se redistributing.dll souborů při každém opětovném kompilaci třídy po změně implementace třídy. Pokud se schéma nezmění na klientovi nebo na serveru, ostatní změny na obou stranách nemají vliv na druhou stranu.

Konstruktory

Name Description
XmlMessageFormatter()

Inicializuje novou instanci XmlMessageFormatter třídy bez sady cílových typů.

XmlMessageFormatter(String[])

Inicializuje novou instanci XmlMessageFormatter třídy a nastaví cílové typy předané jako pole (plně kvalifikované) řetězcové hodnoty.

XmlMessageFormatter(Type[])

Inicializuje novou instanci XmlMessageFormatter třídy a nastaví cílové typy předané jako pole typů objektů.

Vlastnosti

Name Description
TargetTypeNames

Určuje sadu možných typů, které budou deserializovány formátovačem ze zadané zprávy.

TargetTypes

Určuje sadu možných typů, které budou deserializovány formátovačem ze zadané zprávy.

Metody

Name Description
CanRead(Message)

Určuje, zda formátovací modul může deserializovat zprávu.

Clone()

Vytvoří instanci XmlMessageFormatter třídy, jejíž vlastnosti pro čtení a zápis (sady cílových typů) jsou stejné jako aktuální XmlMessageFormatter instance.

Equals(Object)

Určuje, zda je zadaný objekt roven aktuálnímu objektu.

(Zděděno od Object)
GetHashCode()

Slouží jako výchozí funkce hash.

(Zděděno od Object)
GetType()

Získá Type aktuální instance.

(Zděděno od Object)
MemberwiseClone()

Vytvoří mělkou kopii aktuálního Object.

(Zděděno od Object)
Read(Message)

Přečte obsah z dané zprávy a vytvoří objekt, který obsahuje deserializovanou zprávu.

ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)
Write(Message, Object)

Serializuje objekt do textu zprávy.

Platí pro

Viz také