Aracılığıyla paylaş


XmlMessageFormatter Sınıf

Tanım

XSD şema tanımına dayalı 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. Order sınıfı, XSD.exe yardımcı programı tarafından sunucunun gelen iletilerde tanıdığı şemayı oluşturmak için 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 aracılığıyla siparişleri 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 uygulama 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 çıkardığını sıralama 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 herhangi bir istemci uygulaması, yerel olarak tanımlanmış bir sipariş sınıfındaki bilgileri ileti gövdesinde seri hale getirerek sunucuya ileti göndermelidir. Yerel olarak tanımlanan sipariş sınıfı, sunucudaki uygulamanın ileti gövdesini seri durumdan çıkarma girişiminde bulunduğu 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 sipariş sınıfı, sırayı ileti gövdesinde 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 birbirine bağlanmış.

Açıklamalar

XmlMessageFormatter, bir örneğinin MessageQueue kuyruğa yazılan iletileri seri hale getirmek için kullandığı varsayılan biçimlendiricidir. örneğini MessageQueueoluşturduğunuzda, XmlMessageFormatter örneği sizin için oluşturulur ve ile MessageQueueilişkilendirilir. 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. Bu değerlerden birini veya her ikisini de varsayılan biçimlendirici örneğinde ayarlayabilir veya biçimlendiricinin yeni bir örneğini oluşturabilir ve değerleri bağımsız değişken olarak uygun XmlMessageFormatter oluşturucuya geçirerek otomatik olarak ayarlayabilirsiniz.

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

TargetTypeNames ve TargetTypes özellikleri, bir iletiyi seri durumdan çıkarırken biçimlendiriciye hangi şemaların eşleşmeye çalışacaklarını söyler. Bu, biçimlendiricinin ileti gövdesini yorumlamasını sağlar.

İ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 nesne 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 özgüdür. İleti gövdesi, şeması her iki özellik için de dizideki türlerden herhangi biriyle eşleşmeyen bir tür içeriyorsa, 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ın parametresiz bir oluşturucuya sahip olması gerekir.

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ımı, 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

XmlMessageFormatter()

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

XmlMessageFormatter(String[])

Sınıfının yeni bir örneğini XmlMessageFormatter başlatır ve geçirilen hedef türlerini bir dizi (tam) dize değeri olarak 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ürlerini ayarlar.

Özellikler

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

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()

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

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

Geçerli Objectöğesinin sığ 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 dizeyi döndürür.

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

Bir nesneyi iletinin gövdesine serileştirir.

Şunlara uygulanır

Ayrıca bkz.