XmlMessageFormatter クラス

定義

XSD スキーマ定義の XML 書式を使用して、メッセージ本文との間でオブジェクトをシリアル化および逆シリアル化します。Serializes and deserializes objects to or from the body of a message, using the XML format based on the XSD schema definition.

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
継承
XmlMessageFormatter
実装

次のコード例には、サーバーコンポーネント、注文クラス、およびクライアントコードの3つのコードが含まれています。The following code example includes three pieces of code: a server component, an order class, and client code. Order クラスを XSD.EXE ユーティリティで使用して、サーバーが受信メッセージ内で認識するスキーマを生成できます。The order class can be used by the XSD.exe utility to generate schema that the server recognizes within incoming messages. スキーマは、クラスの "形状" を記述する XML 形式のファイルです。The schema is an XML formatted file that describes the "shape" of the class. その後、このスキーマをクライアント側で使用して、サーバークラスと同じスキーマを共有するクライアント固有の順序クラスを生成できます。This schema can then be used on the client side to generate a client-specific order class that shares the same schema as the server class.

次のコード例は、メッセージキューを介して注文を受信するサーバーコンポーネントを表しています。The following code example represents a server component that receives orders through a message queue. メッセージの本文は、次の Order.cs クラスと一致するスキーマを持つ order オブジェクトである必要があります。The body of the message should be an order object whose schema matches the Order.cs class below. サーバープロセスまたはアプリケーションは、注文を逆シリアル化します。The server process or application deserializes the order.

#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

次のコード例は、サーバー上のアプリケーションが受信して逆シリアル化する order オブジェクトのスキーマを提供する order クラスを表しています。The following code example represents the order class that provides a schema for the order objects that the application on the server receives and deserializes.

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

サーバー上のアプリケーションと対話するすべてのクライアントアプリケーションは、ローカルに定義された order クラスの情報をメッセージ本文にシリアル化することによって、サーバーにメッセージを送信する必要があります。Any client application that interacts with the application on the server must send messages to the server by serializing information in a locally defined order class into the message body. ローカルに定義された order クラスは、サーバー定義の order クラスと同じスキーマを持つ必要があります。このクラスは、サーバー上のアプリケーションがメッセージ本文を逆シリアル化しようとします。The locally defined order class must have the same schema as the server-defined order class into which the application on the server will attempt to deserialize the message body. XSD.EXE ユーティリティを使用すると、サーバー上のアプリケーションのマネージャーは、サーバーに送信されるメッセージをシリアル化するためにクライアントが使用する必要のあるスキーマを作成および配布できます。The XSD.exe utility lets the manager of the application on the server create and distribute the schema the client must use to serialize messages going to the server.

クライアントアプリケーションのマネージャーが order クラスのスキーマを受け取ると、XSD.EXE ユーティリティを再度使用して、スキーマからクライアント固有の順序クラスを生成します。When the manager of the client application receives the schema for the order class, the XSD.exe utility is used again to generate a client-specific order class from the schema. このクラスは、サーバーの order クラスではなく、次のクライアントコード例で使用されています (XSD.EXE ユーティリティによって、スキーマによって生成されたクラスは元のクラスと同じ名前になります)。It is this class that is used in the client code example below, not the server's order class (the XSD.exe utility causes the schema-generated class to have the same name as the original class). この新しい order クラスは、注文をメッセージ本文にシリアル化するために使用されます。This new order class is used to serialize the order into the message body.

次のコード例は、注文をシリアル化し、注文に関連付けられた情報をキューに送信するために使用されるクライアント側の処理です。The following code example is the client-side processing, used to serialize an order and send the information associated with the order to a queue. このコードは、XSD.EXE ユーティリティによって Order.cs クラス用に生成されたスキーマの要素に、項目、数量、および住所の情報を関連付けます。The code associates Item, Quantity, and Address information with elements of the schema that were generated for the Order.cs class by the XSD.exe utility. 注文がローカルコンピューターの Orders キューに送信されます。An order is sent to the Orders queue on the local computer.

#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

サーバー上の order クラスからスキーマが生成された後、クラスを変更できます。After the schema is generated from the order class on the server, you can modify the class. スキーマが変更されない限り、スキーマを再配布する必要はありません。Unless the schema changes, you do not need to redistribute the schema. スキーマを配布し、クライアント側の順序クラスを生成した後は、スキーマ自体が変更されていない限り、そのクライアントクラスをサーバーの order クラスとは別に変更することもできます。After you have distributed the schema and generated a client-side order class, that client class can also be modified independently of the server's order class, as long as the schema itself is not modified. この2つのクラスは疎結合になっています。The two classes have become loosely coupled.

注釈

は、のMessageQueueインスタンスがキューに書き込まれたメッセージをシリアル化するために使用する既定のフォーマッタです。 XmlMessageFormatterThe XmlMessageFormatter is the default formatter that an instance of MessageQueue uses to serialize messages written to the queue. MessageQueueインスタンスを作成すると、のXmlMessageFormatterインスタンスが作成され、に関連付けらMessageQueueれます。When you create an instance of MessageQueue, an instance of XmlMessageFormatter is created for you and associated with the MessageQueue. FormatterMessageQueueのフォーマッタを指定するには、コードで作成し、それをのプロパティに割り当てます。You can specify a different formatter by creating it in your code and assigning it to the Formatter property of your MessageQueue.

キューの既定XmlMessageFormatterのインスタンスを使用してキューに書き込むことができますが、フォーマッタでプロパティTargetTypesまたはプロパティを設定するまで、キュー TargetTypeNamesからの読み取りには使用できません。A queue's default XmlMessageFormatter instance can be used to write to the queue, but it cannot be used to read from the queue until you set either the TargetTypes or TargetTypeNames property on the formatter. これらの値の一方または両方を既定のフォーマッタインスタンスに設定することも、フォーマッタの新しいインスタンスを作成し、それらを引数として適切なXmlMessageFormatterコンストラクターに渡すことによって値を自動的に設定することもできます。You can either set one or both of these values on the default formatter instance, or you can create a new instance of the formatter and set the values automatically by passing them as arguments into the appropriate XmlMessageFormatter constructor.

ではTargetTypesなくを指定すると、読み取り時間ではなくコンパイル時に型の存在がチェックされるため、エラーの可能性が減少します。TargetTypeNamesWhen specifying TargetTypes rather than TargetTypeNames, type existence is checked at compile time rather than read time, reducing possibility for error. TargetTypeNamesすべてのエントリが完全に修飾され、アセンブリ名を指定する必要があります。TargetTypeNames requires every entry to be fully qualified, specifying its assembly name. さらに、複数の同時実行バージョンを使用する場合は、ターゲットの型名にもバージョン番号を追加する必要があります。Further, when working with multiple concurrent versions, the version number must also be appended to the target type name as well.

プロパティTargetTypeNamesTargetTypesプロパティは、メッセージを逆シリアル化するときに一致させるスキーマをフォーマッタに指示します。The TargetTypeNames and TargetTypes properties tell the formatter what schemas to attempt to match when deserializing a message. これにより、フォーマッタがメッセージ本文を解釈できるようになります。This allows the formatter to interpret the message body.

メッセージ本文でシリアル化されるインスタンスは、型配列で表されるスキーマのいずれかに準拠している必要があります。The instance serialized in the message body must comply with one of the schemas represented in the type array. Receiveメソッドを使用してメッセージを読み取ると、メソッドによって、識別されたスキーマに対応する型のオブジェクトが作成され、そのオブジェクトにメッセージ本文が読み取られます。When you read the message using the Receive method, the method creates an object of the type that corresponds to the schema identified and reads the message body into it.

キューから読み取る場合は、2つのプロパティのうち1つだけを設定する必要がありますが、両方を設定できます。Only one of the two properties needs to be set when reading from the queue, but you can set both. 一連の型は、2つのプロパティの組み合わせセットです。The set of types is the combined set from the two properties. 使用するプロパティの決定は、アプリケーションに固有のものです。The decision of which property to use is specific to your application. メッセージ本文に、いずれかのプロパティの配列内のいずれの型とも一致しないスキーマを持つ型が含まれている場合、メッセージが読み取られると例外がスローされます。If the message body contains a type whose schema does not match any of the types in the array for either property, an exception will be thrown when the message is read.

XmlMessageFormatter 、疎結合の XML ベースのメッセージングの重要なコンポーネントです。The XmlMessageFormatter is a crucial component of loosely coupled XML-based messaging. XSD.EXE ユーティリティでは、xml 形式を使用して XML スキーマを生成します。たとえば、ユーティリティを使用してアプリケーションで使用されるクラスをシリアル化する場合などです。The XSD.exe utility uses the XML format is used to generate XML schema, such as when you use the utility to serialize a class used by your application. このクラスには、パラメーターなしのコンストラクターが含まれている必要があります。The class must have a parameterless constructor.

この形式は、クラスデータを記述するために配布するスキーマに基づいてクラスを生成するときに、逆プロセスで再び使用されます。The format is used again in the reverse process when the utility generates a class based on the schema you distribute to describe your class data. ユーティリティおよび生成された XML スキーマを使用すると、クラスの実装が変更された後でクラスを再コンパイルするたびに .dll ファイルの再配布を避けることができます。The use of the utility and the XML schema it generates enables you to avoid redistributing.dll files every time you recompile a class after the implementation of your class has changed. スキーマがクライアントまたはサーバーで変更されていない限り、どちらか一方に加えられた変更は他方には影響しません。As long as the schema does not change on the client or the server, other changes on either side do not affect the other.

コンストラクター

XmlMessageFormatter()

対象の型を設定せずに、XmlMessageFormatter クラスの新しいインスタンスを初期化します。Initializes a new instance of the XmlMessageFormatter class, without target types set.

XmlMessageFormatter(String[])

XmlMessageFormatter クラスの新しいインスタンスを初期化し、完全限定型の文字列値の配列として渡された対象の型を設定します。Initializes a new instance of the XmlMessageFormatter class, setting target types passed in as an array of (fully qualified) string values.

XmlMessageFormatter(Type[])

XmlMessageFormatter クラスの新しいインスタンスを初期化し、オブジェクト型の配列として渡された対象の型を設定します。Initializes a new instance of the XmlMessageFormatter class, setting target types passed in as an array of object types.

プロパティ

TargetTypeNames

提供されたメッセージからフォーマッタで逆シリアル化できる型のセットを指定します。Specifies the set of possible types that will be deserialized by the formatter from the message provided.

TargetTypes

提供されたメッセージからフォーマッタで逆シリアル化できる型のセットを指定します。Specifies the set of possible types that will be deserialized by the formatter from the message provided.

メソッド

CanRead(Message)

フォーマッタがメッセージを逆シリアル化できるかどうかを判断します。Determines whether the formatter can deserialize the message.

Clone()

現在の XmlMessageFormatter インスタンスと同じ読み取り/書き込みプロパティ (対象の型のセット) の XmlMessageFormatter クラスのインスタンスを作成します。Creates an instance of the XmlMessageFormatter class whose read/write properties (the sets of target types) are the same as the current XmlMessageFormatter instance.

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判定します。Determines whether the specified object is equal to the current object.

(継承元 Object)
GetHashCode()

既定のハッシュ関数として機能します。Serves as the default hash function.

(継承元 Object)
GetType()

現在のインスタンスの Type を取得します。Gets the Type of the current instance.

(継承元 Object)
MemberwiseClone()

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

(継承元 Object)
Read(Message)

指定されたメッセージからコンテンツを読み取り、逆シリアル化されたメッセージを含むオブジェクトを作成します。Reads the contents from the given message and creates an object that contains the deserialized message.

ToString()

現在のオブジェクトを表す string を返します。Returns a string that represents the current object.

(継承元 Object)
Write(Message, Object)

メッセージ本文にオブジェクトをシリアル化します。Serializes an object into the body of the message.

適用対象

こちらもご覧ください