Aracılığıyla paylaş


XmlMessageFormatter Sınıf

Tanım

XSD şema tanımını temel alan XML biçimini kullanarak bir iletinin gövdesine veya gövdesinden nesneleri serileştirir ve seri durumdan kaldırır.

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
Devralma
XmlMessageFormatter
Uygulamalar

Örnekler

Aşağıdaki kod örneği üç kod parçası içerir: sunucu bileşeni, sipariş sınıfı ve istemci kodu. Sipariş sınıfı, sunucunun gelen iletilerde tanıdığı şemayı oluşturmak için XSD.exe yardımcı programı tarafından kullanılabilir. Şema, sınıfın "şeklini" açıklayan XML biçimli bir dosyadır. Bu şema daha sonra istemci tarafında, sunucu sınıfıyla aynı şemayı paylaşan istemciye özgü bir sipariş sınıfı oluşturmak için kullanılabilir.

Aşağıdaki kod örneği, bir ileti kuyruğu üzerinden sipariş alan bir sunucu bileşenini temsil eder. İletinin gövdesi, şeması aşağıdaki Order.cs sınıfıyla eşleşen bir order nesnesi olmalıdır. Sunucu işlemi veya uygulaması sırayı seri durumdan çıkartır.

#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

Aşağıdaki kod örneği, sunucudaki uygulamanın aldığı ve seri durumdan çıkarması için sipariş nesneleri için bir şema sağlayan sipariş sınıfını temsil eder.

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

Sunucudaki uygulamayla etkileşim kuran tüm istemci uygulamalarının, yerel olarak tanımlanmış bir sipariş sınıfındaki bilgileri ileti gövdesinde serileştirerek sunucuya ileti göndermesi gerekir. Yerel olarak tanımlanan sipariş sınıfı, sunucudaki uygulamanın ileti gövdesini seri durumdan kaldırmaya çalışacağı sunucu tanımlı sipariş sınıfıyla aynı şemaya sahip olmalıdır. XSD.exe yardımcı programı, sunucudaki uygulama yöneticisinin istemcinin sunucuya giden iletileri seri hale getirmek için kullanması gereken şemayı oluşturmasına ve dağıtmasına olanak tanır.

İstemci uygulamasının yöneticisi sipariş sınıfı için şemayı aldığında, şemadan istemciye özgü bir sipariş sınıfı oluşturmak için XSD.exe yardımcı programı yeniden kullanılır. Sunucunun sipariş sınıfı değil aşağıdaki istemci kodu örneğinde kullanılan bu sınıftır (XSD.exe yardımcı programı şema tarafından oluşturulan sınıfın özgün sınıfla aynı ada sahip olmasını sağlar). Bu yeni order sınıfı, sırayı ileti gövdesine seri hale getirmek için kullanılır.

Aşağıdaki kod örneği, bir siparişi seri hale getirmek ve siparişle ilişkili bilgileri kuyruğa göndermek için kullanılan istemci tarafı işlemedir. Kod, Item, Quantity ve Address bilgilerini XSD.exe yardımcı programı tarafından Order.cs sınıfı için oluşturulan şema öğeleriyle ilişkilendirir. Yerel bilgisayardaki Siparişler kuyruğuna bir sipariş gönderilir.

#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

Şema sunucudaki order sınıfından oluşturulduktan sonra sınıfını değiştirebilirsiniz. Şema değişmediği sürece, şemayı yeniden dağıtmanız gerekmez. Şemayı dağıttıktan ve bir istemci tarafı sipariş sınıfı oluşturduktan sonra, şemanın kendisi değiştirilmediği sürece bu istemci sınıfı sunucunun sipariş sınıfından bağımsız olarak da değiştirilebilir. İki sınıf gevşek bir şekilde birleşti.

Açıklamalar

XmlMessageFormatter, örneğinin MessageQueue kuyruğa yazılan iletileri seri hale getirmek için kullandığı varsayılan biçimlendiricidir. örneğini MessageQueueXmlMessageFormatter oluşturduğunuzda, örneği sizin için oluşturulur ve ile ilişkilendirilirMessageQueue. Kodunuzda oluşturup özelliğine FormatterMessageQueueatayarak farklı bir biçimlendirici belirtebilirsiniz.

Kuyruğun varsayılan XmlMessageFormatter örneği kuyruğa yazmak için kullanılabilir, ancak biçimlendiricide veya TargetTypeNames özelliğini ayarlamadığınız TargetTypes sürece kuyruktan okumak için kullanılamaz. Varsayılan biçimlendirici örneğinde bu değerlerden birini veya her ikisini de ayarlayabilir veya biçimlendiricinin yeni bir örneğini oluşturabilir ve bunları uygun XmlMessageFormatter oluşturucuya bağımsız değişken olarak geçirerek değerleri otomatik olarak ayarlayabilirsiniz.

yerine TargetTypeNamesbelirtirkenTargetTypes, tür varlığı okuma zamanı yerine derleme zamanında denetlenerek hata olasılığını azaltır. TargetTypeNames her girişin tam olarak nitelenmiş olmasını gerektirir ve derleme adını belirtir. Ayrıca, birden çok eşzamanlı sürümle çalışırken, sürüm numarasının da hedef tür adına eklenmesi gerekir.

TargetTypeNames ve TargetTypes özellikleri, biçimlendiriciye bir iletiyi seri durumdan çıkarırken hangi şemaların eşleşmeyi deneyeceklerini söyler. Bu, biçimlendiricinin ileti gövdesini yorumlamasına olanak tanır.

İleti gövdesinde seri hale getirilmiş örneğin tür dizisinde temsil edilen şemalardan biriyle uyumlu olması gerekir. yöntemini kullanarak Receive iletiyi okuduğunuzda, yöntemi tanımlanan şemaya karşılık gelen türde bir nesnesi oluşturur ve ileti gövdesini bu şemaya okur.

Kuyruktan okurken iki özellikten yalnızca birinin ayarlanması gerekir, ancak her ikisini de ayarlayabilirsiniz. Tür kümesi, iki özellikten birleştirilmiş kümedir. Hangi özelliğin kullanılacağına ilişkin karar uygulamanıza özeldir. İleti gövdesinde, her iki özellik için de dizideki türlerin hiçbirindeki şemayla eşleşmeyen bir tür varsa, ileti okunduğunda bir özel durum oluşturulur.

, XmlMessageFormatter gevşek bir şekilde bağlanmış XML tabanlı mesajlaşmanın önemli bir bileşenidir. XSD.exe yardımcı programı XML biçimini kullanarak XML şeması oluşturur. Örneğin, yardımcı programını kullanarak uygulamanız tarafından kullanılan bir sınıfı seri hale getirebilirsiniz. sınıfı parametresiz bir oluşturucuya sahip olmalıdır.

Biçim, yardımcı program sınıf verilerinizi açıklamak için dağıttığınız şemayı temel alan bir sınıf oluşturduğunda ters işlemde yeniden kullanılır. Yardımcı programının ve oluşturduğu XML şemasının kullanılması, sınıfınızın uygulanması değiştikten sonra bir sınıfı her yeniden derlediğinizde redistributing.dll dosyalardan kaçınmanızı sağlar. Şema istemcide veya sunucuda değişmediği sürece, her iki taraftaki diğer değişiklikler diğerini etkilemez.

Oluşturucular

Name Description
XmlMessageFormatter()

Hedef türleri ayarlanmadan sınıfın XmlMessageFormatter yeni bir örneğini başlatır.

XmlMessageFormatter(String[])

Sınıfın XmlMessageFormatter yeni bir örneğini başlatır ve bir dizi (tam) dize değeri olarak geçirilen hedef türleri ayarlar.

XmlMessageFormatter(Type[])

Sınıfın XmlMessageFormatter yeni bir örneğini başlatır ve nesne türleri dizisi olarak geçirilen hedef türleri ayarlar.

Özellikler

Name Description
TargetTypeNames

Sağlanan iletiden biçimlendirici tarafından seri durumdan çıkarılacak olası türler kümesini belirtir.

TargetTypes

Sağlanan iletiden biçimlendirici tarafından seri durumdan çıkarılacak olası türler kümesini belirtir.

Yöntemler

Name Description
CanRead(Message)

Biçimlendiricinin iletiyi seri durumdan çıkarıp çıkaramayacağını belirler.

Clone()

Okuma/yazma özellikleri (hedef tür kümeleri) geçerli XmlMessageFormatter örnekle aynı olan sınıfın bir örneğini XmlMessageFormatter oluşturur.

Equals(Object)

Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler.

(Devralındığı yer: Object)
GetHashCode()

Varsayılan karma işlevi işlevi görür.

(Devralındığı yer: Object)
GetType()

Geçerli örneğin Type alır.

(Devralındığı yer: Object)
MemberwiseClone()

Geçerli Objectbasit bir kopyasını oluşturur.

(Devralındığı yer: Object)
Read(Message)

Verilen iletinin içeriğini okur ve seri durumdan çıkarılmış iletiyi içeren bir nesne oluşturur.

ToString()

Geçerli nesneyi temsil eden bir dize döndürür.

(Devralındığı yer: Object)
Write(Message, Object)

Bir nesneyi iletinin gövdesinde serileştirir.

Şunlara uygulanır

Ayrıca bkz.