XmlMessageFormatter クラスとは? わかりやすく解説

XmlMessageFormatter クラス

XSD スキーマ定義の XML 書式使用してメッセージ本文との間でオブジェクトシリアル化および逆シリアル化ます。

名前空間: System.Messaging
アセンブリ: System.Messaging (system.messaging.dll 内)
構文構文

Public Class XmlMessageFormatter
    Implements IMessageFormatter, ICloneable
Dim instance As XmlMessageFormatter
public class XmlMessageFormatter : IMessageFormatter,
 ICloneable
public ref class XmlMessageFormatter : IMessageFormatter,
 ICloneable
public class XmlMessageFormatter implements
 IMessageFormatter, ICloneable
public class XmlMessageFormatter implements
 IMessageFormatter, ICloneable
解説解説

XmlMessageFormatter は、キュー書き込まれメッセージシリアル化するために MessageQueueインスタンス使用する既定フォーマッタです。MessageQueueインスタンス作成するときに、XmlMessageFormatterインスタンス作成されMessageQueue関連付けられます。別のフォーマッタ指定するには、コード内でそのフォーマッタ作成して MessageQueueFormatter プロパティ割り当てます

キュー既定XmlMessageFormatter インスタンス使用してキュー書き込むことができますが、これを使用してキューから読み取るには、フォーマッタで TargetTypes プロパティまたは TargetTypeNames プロパティ設定する必要があります既定フォーマッタインスタンスで、これらの値の一方または両方設定できます。または、フォーマッタ新しインスタンス作成し、値を適切な XmlMessageFormatter コンストラクタ引数として渡すことによって、自動的に設定できます

TargetTypeNames ではなく TargetTypes指定する場合は、読み取りではなくコンパイル時に型の存在確認することで、エラー可能性抑制されます。TargetTypeNames では、すべてのエントリが完全に限定されアセンブリ名指定されている必要があります。さらに、複数のバージョン同時に操作する場合は、対象型名バージョン番号追加する必要があります

TargetTypeNames プロパティおよび TargetTypes プロパティを使うと、メッセージの逆シリアル化時にフォーマッタがどのスキーマ一致させるかを指示できます。これにより、フォーマッタメッセージ本文解釈できます

メッセージ本文シリアル化されるインスタンスは、型配列表されスキーマ1 つに従っている必要がありますReceive メソッド使用してメッセージ読み取る場合は、識別されスキーマ対応する型のオブジェクトがこのメソッドによって作成され、そこにメッセージ本文読み込まれます。

キューから読み取るときに設定する必要があるのは、2 つプロパティのうちの 1 つだけですが、両方設定することもできます。型のセットとは、2 つプロパティの型を結合したものです。どのプロパティ使用するかは、アプリケーションによって異なりますメッセージ本文に、両方プロパティ配列内のどの型ともスキーマ一致しない型が含まれている場合は、メッセージ読み取り時に例外スローさます。

XmlMessageFormatter は、疎結合された重要な XML ベースメッセージ処理コンポーネントです。XSD.exe ユーティリティは、ユーティリティ使用してアプリケーション使用するクラスシリアル化するときなどに、XML 書式使用して XML スキーマ生成します。このクラスには既定コンストラクタが必要です。

この書式は、クラス データ記述するために配布するスキーマ基づいてユーティリティクラス生成するときに、逆のプロセスで再び使用されます。ユーティリティユーティリティ生成する XML スキーマ使用すると、クラス実装変更された後、クラスを再コンパイルするたびに .dll ファイル再配布する必要がなくなりますクライアントまたはサーバースキーマ変更され場合除きどちらか一方でその他の変更が行われても、もう一方影響与えることはありません。

使用例使用例

サーバー コンポーネントorder クラス、およびクライアント コード3 つのコード含まれているコード例次に示します。XSD.exe ユーティリティorder クラス使用すると、受信メッセージ内でサーバー認識するスキーマ生成できますスキーマは、XML 形式ファイルで、クラスの "形" を記述します次にクライアント側でこのスキーマ使用してサーバー クラスと同じスキーマ共有するクライアント固有の order クラス生成できます

メッセージ キュー通じてオーダー受信するサーバー コンポーネントを表すコード例次に示しますメッセージ本文は、スキーマが下の Order.cs クラス一致するオーダー オブジェクトです。サーバー プロセスまたはサーバー アプリケーションが、オーダーを逆シリアル化ます。

Imports System
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 'Main
    
    
    ' 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 'EnsureQueueExists
End Class 'Server
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);
         }
     }
 }
#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();
   }
}

import System.*;
import System.Messaging.*;

public class Server
{
    public static void main(String[]
 args)
    {
        Console.WriteLine("Processing Orders");

        String queuePath = ".\\orders";
        EnsureQueueExists(queuePath);
        MessageQueue queue = new MessageQueue(queuePath);
        ((XmlMessageFormatter)queue.get_Formatter()).
            set_TargetTypeNames(new String[] { "Order"
 });

        while (true) {
            Order newOrder = (Order)queue.Receive().get_Body();
            newOrder.ShipItems();
        }
    } //main

    // Creates the queue if it does not already exist.
    public static void EnsureQueueExists(String
 path)
    {
        if (!(MessageQueue.Exists(path))) {
            MessageQueue.Create(path);
        }
    } //EnsureQueueExists
} //Server

サーバーアプリケーション受信してシリアル化するオーダー オブジェクト対すスキーマ提供する order クラスを表すコード例次に示します

Imports System
Imports Microsoft.VisualBasic

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 'ShipItems 
End Class 'Order 
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. */
 
     }
 }
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. */
   }

};

import 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}", System.Convert.ToString(itemId));
        Console.WriteLine("\tQuantity : {0}", System.Convert.ToString(quantity));
        Console.WriteLine("\tShip To  : {0}", System.Convert.ToString(address));
        // Add order to the database.
        /* Insert code here. */
    } //ShipItems 
} //Order 

サーバーアプリケーションやり取りするすべてのクライアント アプリケーションは、ローカル定義されorder クラス情報メッセージ本文シリアル化して、メッセージサーバー送信する必要がありますローカル定義されorder クラスには、サーバーアプリケーションメッセージ本文を逆シリアル化するサーバー定義の order クラスと同じスキーマが必要です。XSD.exe ユーティリティ使用すると、サーバーアプリケーション マネージャは、サーバー送信するメッセージシリアル化クライアント使用するスキーマ作成および配布できます

クライアント アプリケーション マネージャorder クラススキーマ受信すると、XSD.exe ユーティリティを再び使用してスキーマからクライアント固有の order クラス生成します。下のクライアント コード例では、サーバーorder クラスではなく、このクラス使用します。XSD.exe ユーティリティは、スキーマ生成クラスに元のクラスと同じ名前を付けます。この新しorder クラス使用してオーダーメッセージ本文シリアル化ます。

オーダーシリアル化し、オーダー関連付けられた情報キュー送信するクライアント側の処理を行うコード例次に示します。このコードは、XSD.exe ユーティリティで Order.cs クラス用に生成されスキーマ要素品目数量住所情報関連付けます。オーダーは、ローカル コンピュータOrders キュー送信されます。

Imports System
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 'Main
    
    ' 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 'EnsureQueueExists
End Class 'Client 
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);
         }
     }
 
 }
#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();
}

import System.*;
import System.Messaging.*;

class Client
{
    public static void main(String
 args[])
    {
        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();
    } //main

    // Creates the queue if it does not already exist.
    public static void EnsureQueueExists(String
 path)
    {
        if (!(MessageQueue.Exists(path))) {
            MessageQueue.Create(path);
        }
    } //EnsureQueueExists
} //Client

スキーマサーバーorder クラスから生成され後でも、クラス変更できますスキーマ変更した場合除いてスキーマ再配布する必要はありません。スキーマ配布しクライアント側order クラス生成した後は、スキーマそのもの変更されていない場合、そのクライアント クラスサーバーorder クラスから独立して変更できます2 つクラスは、疎結合されています。

継承階層継承階層
System.Object
  System.Messaging.XmlMessageFormatter
スレッド セーフスレッド セーフ
この型の public static (Visual Basic では Shared) メンバはすべて、スレッド セーフです。インスタンス メンバ場合は、スレッド セーフであるとは限りません。
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照
関連項目
XmlMessageFormatter メンバ
System.Messaging 名前空間
MessageQueue クラス
ActiveXMessageFormatter クラス
BinaryMessageFormatter クラス
IMessageFormatter インターフェイス



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「XmlMessageFormatter クラス」の関連用語

XmlMessageFormatter クラスのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



XmlMessageFormatter クラスのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2025 Microsoft.All rights reserved.

©2025 GRAS Group, Inc.RSS