Share via


XmlMessageFormatter Kelas

Definisi

Menserialisasikan dan mendeserialisasi objek ke atau dari isi pesan, menggunakan format XML berdasarkan definisi skema 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
Warisan
XmlMessageFormatter
Penerapan

Contoh

Contoh kode berikut mencakup tiga bagian kode: komponen server, kelas pesanan, dan kode klien. Kelas pesanan dapat digunakan oleh utilitas XSD.exe untuk menghasilkan skema yang dikenali server dalam pesan masuk. Skema adalah file berformat XML yang menjelaskan "bentuk" kelas. Skema ini kemudian dapat digunakan di sisi klien untuk menghasilkan kelas pesanan khusus klien yang berbagi skema yang sama dengan kelas server.

Contoh kode berikut mewakili komponen server yang menerima pesanan melalui antrean pesan. Isi pesan harus menjadi objek pesanan yang skemanya cocok dengan kelas Order.cs di bawah ini. Proses server atau aplikasi mendeserialisasi pesanan.

#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

Contoh kode berikut mewakili kelas pesanan yang menyediakan skema untuk objek pesanan yang diterima dan dideserialisasi oleh aplikasi di server.

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

Setiap aplikasi klien yang berinteraksi dengan aplikasi di server harus mengirim pesan ke server dengan menserialisasikan informasi dalam kelas pesanan yang ditentukan secara lokal ke dalam isi pesan. Kelas pesanan yang ditentukan secara lokal harus memiliki skema yang sama dengan kelas urutan yang ditentukan server tempat aplikasi di server akan mencoba mendeserialisasi isi pesan. Utilitas XSD.exe memungkinkan manajer aplikasi di server membuat dan mendistribusikan skema yang harus digunakan klien untuk menserialisasikan pesan yang masuk ke server.

Ketika manajer aplikasi klien menerima skema untuk kelas pesanan, utilitas XSD.exe digunakan lagi untuk menghasilkan kelas pesanan khusus klien dari skema. Kelas inilah yang digunakan dalam contoh kode klien di bawah ini, bukan kelas pesanan server (utilitas XSD.exe menyebabkan kelas yang dihasilkan skema memiliki nama yang sama dengan kelas asli). Kelas urutan baru ini digunakan untuk menserialisasikan pesanan ke dalam isi pesan.

Contoh kode berikut adalah pemrosesan sisi klien, digunakan untuk membuat serialisasi pesanan dan mengirim informasi yang terkait dengan pesanan ke antrean. Kode mengaitkan informasi Item, Kuantitas, dan Alamat dengan elemen skema yang dihasilkan untuk kelas Order.cs oleh utilitas XSD.exe. Pesanan dikirim ke antrean Pesanan di komputer lokal.

#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

Setelah skema dihasilkan dari kelas pesanan di server, Anda dapat memodifikasi kelas . Kecuali jika skema berubah, Anda tidak perlu mendistribusikan ulang skema. Setelah Anda mendistribusikan skema dan menghasilkan kelas pesanan sisi klien, kelas klien tersebut juga dapat dimodifikasi secara independen dari kelas pesanan server, selama skema itu sendiri tidak dimodifikasi. Dua kelas telah digabungkan secara longgar.

Keterangan

XmlMessageFormatter adalah formatter default yang digunakan instans MessageQueue untuk menserialisasikan pesan yang ditulis ke antrean. Saat Anda membuat instans MessageQueue, instans XmlMessageFormatter dibuat untuk Anda dan dikaitkan dengan MessageQueue. Anda dapat menentukan formatter yang berbeda dengan membuatnya dalam kode Anda dan menetapkannya ke Formatter properti Anda MessageQueue.

Instans default XmlMessageFormatter antrean dapat digunakan untuk menulis ke antrean, tetapi tidak dapat digunakan untuk membaca dari antrean hingga Anda mengatur TargetTypes properti atau TargetTypeNames pada pemformat. Anda dapat mengatur salah satu atau kedua nilai ini pada instans pemformat default, atau Anda dapat membuat instans baru pemformat dan mengatur nilai secara otomatis dengan meneruskannya sebagai argumen ke konstruktor yang sesuai XmlMessageFormatter .

Saat menentukan TargetTypes bukan TargetTypeNames, keberadaan jenis diperiksa pada waktu kompilasi daripada waktu baca, mengurangi kemungkinan kesalahan. TargetTypeNames mengharuskan setiap entri sepenuhnya memenuhi syarat, menentukan nama assembly-nya. Selanjutnya, saat bekerja dengan beberapa versi bersamaan, nomor versi juga harus ditambahkan ke nama jenis target juga.

Properti TargetTypeNames dan TargetTypes memberi tahu pemformat skema apa yang akan dicocokkan saat mendeserialisasi pesan. Ini memungkinkan pemformat untuk menginterpretasikan isi pesan.

Instans yang diserialisasikan dalam isi pesan harus mematuhi salah satu skema yang diwakili dalam array jenis. Saat Anda membaca pesan menggunakan Receive metode , metode membuat objek jenis yang sesuai dengan skema yang diidentifikasi dan membaca isi pesan ke dalamnya.

Hanya salah satu dari dua properti yang perlu diatur saat membaca dari antrean, tetapi Anda dapat mengatur keduanya. Kumpulan jenis adalah kumpulan gabungan dari dua properti. Keputusan properti mana yang akan digunakan khusus untuk aplikasi Anda. Jika isi pesan berisi jenis yang skemanya tidak cocok dengan salah satu jenis dalam array untuk salah satu properti, pengecualian akan dilemparkan saat pesan dibaca.

XmlMessageFormatter adalah komponen penting dari pesan berbasis XML yang digabungkan secara longgar. Utilitas XSD.exe menggunakan format XML digunakan untuk menghasilkan skema XML, seperti saat Anda menggunakan utilitas untuk membuat serial kelas yang digunakan oleh aplikasi Anda. Kelas harus memiliki konstruktor tanpa parameter.

Format digunakan lagi dalam proses terbalik ketika utilitas menghasilkan kelas berdasarkan skema yang Anda distribusikan untuk menjelaskan data kelas Anda. Penggunaan utilitas dan skema XML yang dihasilkannya memungkinkan Anda untuk menghindari redistributing.dll file setiap kali Anda mengkombinasikan ulang kelas setelah implementasi kelas Anda berubah. Selama skema tidak berubah pada klien atau server, perubahan lain di kedua sisi tidak memengaruhi yang lain.

Konstruktor

XmlMessageFormatter()

Menginisialisasi instans XmlMessageFormatter baru kelas, tanpa jenis target yang ditetapkan.

XmlMessageFormatter(String[])

Menginisialisasi instans XmlMessageFormatter baru kelas, mengatur jenis target yang diteruskan sebagai array nilai string (sepenuhnya memenuhi syarat).

XmlMessageFormatter(Type[])

Menginisialisasi instans XmlMessageFormatter baru kelas, mengatur jenis target yang diteruskan sebagai array jenis objek.

Properti

TargetTypeNames

Menentukan kumpulan kemungkinan jenis yang akan dideserialisasi oleh pemformat dari pesan yang disediakan.

TargetTypes

Menentukan kumpulan kemungkinan jenis yang akan dideserialisasi oleh pemformat dari pesan yang disediakan.

Metode

CanRead(Message)

Menentukan apakah pemformat dapat mendeserialisasi pesan.

Clone()

Membuat instans XmlMessageFormatter kelas yang properti baca/tulisnya (set jenis target) sama dengan instans saat ini XmlMessageFormatter .

Equals(Object)

Menentukan apakah objek yang ditentukan sama dengan objek saat ini.

(Diperoleh dari Object)
GetHashCode()

Berfungsi sebagai fungsi hash default.

(Diperoleh dari Object)
GetType()

Mendapatkan instans Type saat ini.

(Diperoleh dari Object)
MemberwiseClone()

Membuat salinan dangkal dari yang saat ini Object.

(Diperoleh dari Object)
Read(Message)

Membaca konten dari pesan yang diberikan dan membuat objek yang berisi pesan yang dideserialisasi.

ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)
Write(Message, Object)

Menserialisasikan objek ke dalam isi pesan.

Berlaku untuk

Lihat juga