通过


XmlMessageFormatter 构造函数

定义

初始化 XmlMessageFormatter 类的新实例。

重载

名称 说明
XmlMessageFormatter()

初始化类的新实例 XmlMessageFormatter ,而不设置目标类型。

XmlMessageFormatter(String[])

初始化类的新实例 XmlMessageFormatter ,将传入的目标类型设置为(完全限定)字符串值的数组。

XmlMessageFormatter(Type[])

初始化类的新实例 XmlMessageFormatter ,并将传入的目标类型设置为对象类型的数组。

XmlMessageFormatter()

初始化类的新实例 XmlMessageFormatter ,而不设置目标类型。

public:
 XmlMessageFormatter();
public XmlMessageFormatter();
Public Sub New ()

注解

写入队列时,此构造函数的重载最常使用,因为写入时不需要目标类型。

若要使用此构造函数创建的实例 XmlMessageFormatter 从队列中读取消息,必须设置 TargetTypeNamesTargetTypes 属性,以便格式化程序知道要尝试反序列化的类型。

创建新 MessageQueue实例时,将创建默认 XmlMessageFormatter 实例,而不设置目标类型。 与使用此构造函数创建的格式化程序一样,如果要从队列中读取,则必须为该格式化程序实例设置目标类型。

适用于

XmlMessageFormatter(String[])

初始化类的新实例 XmlMessageFormatter ,将传入的目标类型设置为(完全限定)字符串值的数组。

public:
 XmlMessageFormatter(cli::array <System::String ^> ^ targetTypeNames);
public XmlMessageFormatter(string[] targetTypeNames);
new System.Messaging.XmlMessageFormatter : string[] -> System.Messaging.XmlMessageFormatter
Public Sub New (targetTypeNames As String())

参数

targetTypeNames
String[]

一个类型 String 数组,该数组指定将由格式化程序从提供的消息反序列化的可能类型集。 这些值必须完全限定,例如“MyNamespace.MyOrders, MyOrdersAssemblyName”。

例外

参数 targetTypeNamesnull.

示例

#using <system.dll>
#using <system.messaging.dll>
#using <system.drawing.dll>

using namespace System;
using namespace System::Messaging;
using namespace System::Drawing;
using namespace System::IO;
ref class Order
{
public:
   int orderId;
   DateTime orderTime;
};

ref class MyNewQueue
{
public:
   static void CreateQueue( String^ queuePath )
   {
      try
      {
         if (  !MessageQueue::Exists( queuePath ) )
         {
            MessageQueue::Create( queuePath );
         }
         else
         {
            Console::WriteLine(  "{0} already exists.", queuePath );
         }
      }
      catch ( MessageQueueException^ e ) 
      {
         Console::WriteLine( e->Message );
      }

   }

   void SendMessage()
   {
      try
      {
         // Create a new order and set values.
         Order^ sentOrder = gcnew Order;
         sentOrder->orderId = 3;
         sentOrder->orderTime = DateTime::Now;

         // Connect to a queue on the local computer.
         MessageQueue^ myQueue = gcnew MessageQueue( ".\\myQueue" );

         // Create the new order.
         Message^ myMessage = gcnew Message( sentOrder );

         // Send the order to the queue.
         myQueue->Send( myMessage );
      }
      catch ( ArgumentException^ e ) 
      {
         Console::WriteLine( e->Message );
      }

      return;
   }

   void ReceiveMessage()
   {
      // Connect to the a queue on the local computer.
      MessageQueue^ myQueue = gcnew MessageQueue( ".\\myQueue" );

      // Set the formatter to indicate body contains an Order.
      array<Type^>^p = gcnew array<Type^>(1);
      p[ 0 ] = Order::typeid;
      myQueue->Formatter = gcnew XmlMessageFormatter( p );
      try
      {
         // Receive and format the message. 
         Message^ myMessage = myQueue->Receive();
         Order^ myOrder = dynamic_cast<Order^>(myMessage->Body);

         // Display message information.
         Console::WriteLine( "Order ID: {0}", myOrder->orderId );
         Console::WriteLine( "Sent: {0}", myOrder->orderTime );
      }
      catch ( MessageQueueException^ ) 
      {
         // Handle Message Queuing exceptions.
      }
      // Handle invalid serialization format.
      catch ( InvalidOperationException^ e ) 
      {
         Console::WriteLine( e->Message );
      }

      // Catch other exceptions as necessary.
      return;
   }
};

int main()
{
   // Create a new instance of the class.
   MyNewQueue^ myNewQueue = gcnew MyNewQueue;

   // Create a queue on the local computer.
   MyNewQueue::CreateQueue( ".\\myQueue" );

   // Send a message to a queue.
   myNewQueue->SendMessage();

   // Receive a message from a queue.
   myNewQueue->ReceiveMessage();
   return 0;
}
using System;
using System.Messaging;
using System.Drawing;
using System.IO;

namespace MyProject
{

    // The following example
    // sends to a queue and receives from a queue.
    public class Order
    {
        public int orderId;
        public DateTime orderTime;
    };	

    /// <summary>
    /// Provides a container class for the example.
    /// </summary>
    public class MyNewQueue
    {

        //**************************************************
        // Provides an entry point into the application.
        //		
        // This example sends and receives a message from
        // a queue.
        //**************************************************

        public static void Main()
        {
            // Create a new instance of the class.
            MyNewQueue myNewQueue = new MyNewQueue();

            // Create a queue on the local computer.
            CreateQueue(".\\myQueue");
            
            // Send a message to a queue.
            myNewQueue.SendMessage();

            // Receive a message from a queue.
            myNewQueue.ReceiveMessage();

            return;
        }

        //**************************************************
        // Creates a new queue.
        //**************************************************

        public static void CreateQueue(string queuePath)
        {
            try	
            {
                if(!MessageQueue.Exists(queuePath))
                {
                    MessageQueue.Create(queuePath);
                }
                else
                {
                    Console.WriteLine(queuePath + " already exists.");
                }
            }
            catch (MessageQueueException e)
            {
                Console.WriteLine(e.Message);
            }
        }

        //**************************************************
        // Sends an Order to a queue.
        //**************************************************
        
        public void SendMessage()
        {
            try
            {

                // Create a new order and set values.
                Order sentOrder = new Order();
                sentOrder.orderId = 3;
                sentOrder.orderTime = DateTime.Now;

                // Connect to a queue on the local computer.
                MessageQueue myQueue = new MessageQueue(".\\myQueue");

                // Create the new order.
                Message myMessage = new Message(sentOrder);

                // Send the order to the queue.
                myQueue.Send(myMessage);
            }
            catch(ArgumentException e)
            {
                Console.WriteLine(e.Message);
            }

            return;
        }

        //**************************************************
        // Receives a message containing an order.
        //**************************************************
        
        public  void ReceiveMessage()
        {
            // Connect to the a queue on the local computer.
            MessageQueue myQueue = new MessageQueue(".\\myQueue");

            // Set the formatter to indicate body contains an Order.
            myQueue.Formatter = new XmlMessageFormatter(new Type[]
                {typeof(MyProject.Order)});
            
            try
            {
                // Receive and format the message.
                Message myMessage =	myQueue.Receive();
                Order myOrder = (Order)myMessage.Body;

                // Display message information.
                Console.WriteLine("Order ID: " +
                    myOrder.orderId.ToString());
                Console.WriteLine("Sent: " +
                    myOrder.orderTime.ToString());
            }
            
            catch (MessageQueueException)
            {
                // Handle Message Queuing exceptions.
            }

                // Handle invalid serialization format.
            catch (InvalidOperationException e)
            {
                Console.WriteLine(e.Message);
            }
            
            // Catch other exceptions as necessary.

            return;
        }
    }
}
Imports System.Messaging
Imports System.Drawing
Imports System.IO



   
' The following example 
' sends to a queue and receives from a queue.
Public Class Order
      Public orderId As Integer
      Public orderTime As DateTime
End Class

   
  
' Provides a container class for the example.

Public Class MyNewQueue
      
      

   ' Provides an entry point into the application.
   '		 
   ' This example sends and receives a message from
   ' a queue.

   Public Shared Sub Main()
      ' Create a new instance of the class.
      Dim myNewQueue As New MyNewQueue()
        
      ' Create a queue on the local computer.
      CreateQueue(".\myQueue")
         
      ' Send a message to a queue.
      myNewQueue.SendMessage()
       
      ' Receive a message from a queue.
      myNewQueue.ReceiveMessage()
         
      Return
   End Sub
      
      

      ' Creates a new queue.
   Public Shared Sub CreateQueue(queuePath As String)
      Try
         If Not MessageQueue.Exists(queuePath) Then
            MessageQueue.Create(queuePath)
         Else
            Console.WriteLine((queuePath + " already exists."))
         End If
      Catch e As MessageQueueException
         Console.WriteLine(e.Message)
      End Try
   End Sub
       
      

      ' Sends an Order to a queue.

   Public Sub SendMessage()
      Try
            
            ' Create a new order and set values.
            Dim sentOrder As New Order()
            sentOrder.orderId = 3
            sentOrder.orderTime = DateTime.Now
            
            ' Connect to a queue on the local computer.
            Dim myQueue As New MessageQueue(".\myQueue")
            
            
            
            ' Create the new order.
            Dim myMessage As New Message(sentOrder)
            
            ' Send the order to the queue.
            myQueue.Send(myMessage)
      Catch e As ArgumentException
            Console.WriteLine(e.Message)
      End Try 
         
      Return
   End Sub
      
      
      
 
      ' Receives a message containing an order.
 
   Public Sub ReceiveMessage()
         ' Connect to the a queue on the local computer.
         Dim myQueue As New MessageQueue(".\myQueue")
         
         ' Set the formatter to indicate body contains an Order.
         myQueue.Formatter = New XmlMessageFormatter(New Type() {GetType(Order)})
         
         Try
            ' Receive and format the message. 
            Dim myMessage As Message = myQueue.Receive()
            Dim myOrder As Order = CType(myMessage.Body, Order)
            
            ' Display message information.
            Console.WriteLine(("Order ID: " + myOrder.orderId.ToString()))
            Console.WriteLine(("Sent: " + myOrder.orderTime.ToString()))
         
  
         ' Handle invalid serialization format.
         Catch e As InvalidOperationException
            Console.WriteLine(e.Message)
         End Try
         
         ' Catch other exceptions as necessary.
         Return
   End Sub
End Class

注解

从队列读取时,最常使用具有目标类型参数的构造函数。 编写时,不需要指定目标类型。

此构造函数重 XmlMessageFormatter 载将 TargetTypeNames 属性设置为通过参数传入的 targetTypeNames 数组值。 设置此属性允许 MessageQueue 使用此 XmlMessageFormatter 实例读取包含给定类型对象的消息。

TargetTypeNamesTargetTypes属性都告诉格式化程序反序列化消息时要尝试匹配的架构。 这允许格式化程序解释消息正文。

消息正文中序列化的实例必须符合类型数组中表示的架构之一。 使用 Receive 该方法读取消息时,该方法将创建一个与标识的架构相对应的类型的对象,并将消息正文读入其中。

从队列中读取时,只需要设置两个属性中的一个,但你可以同时设置这两个属性。 类型集是两个属性的组合集。 要使用的决定特定于应用程序。 如果消息正文包含一个类型,其架构与任一属性的数组中的任何类型不匹配,则会在读取时引发异常。

适用于

XmlMessageFormatter(Type[])

初始化类的新实例 XmlMessageFormatter ,并将传入的目标类型设置为对象类型的数组。

public:
 XmlMessageFormatter(cli::array <Type ^> ^ targetTypes);
public XmlMessageFormatter(Type[] targetTypes);
new System.Messaging.XmlMessageFormatter : Type[] -> System.Messaging.XmlMessageFormatter
Public Sub New (targetTypes As Type())

参数

targetTypes
Type[]

一个类型 Type 数组,该数组指定将由格式化程序从提供的消息反序列化的可能类型集。

例外

参数 targetTypesnull.

注解

从队列读取时,最常使用具有目标类型参数的构造函数。 编写时,不需要指定目标类型。

此构造函数重 XmlMessageFormatter 载将 TargetTypes 属性设置为通过参数传入的 targetTypes 数组值。 设置此属性使 MessageQueue 使用此 XmlMessageFormatter 实例可以读取包含给定类型对象的消息。

TargetTypeNamesTargetTypes属性都告诉格式化程序反序列化消息时要尝试匹配的架构。 这允许格式化程序解释消息正文。

消息正文中序列化的实例必须符合类型数组中表示的架构之一。 使用 Receive 该方法读取消息时,该方法将创建一个与标识的架构相对应的类型的对象,并将消息正文读入其中。

从队列中读取时,只需要设置两个属性中的一个,但你可以同时设置这两个属性。 类型集是两个属性的组合集。 要使用的决定特定于应用程序。 如果消息正文包含一个类型,其架构与任一属性的数组中的任何类型不匹配,则会在读取时引发异常。

指定 TargetTypes 类型时(而不是 TargetTypeNames)在编译时(而不是读取时间)进行检查,从而减少错误的可能性。 TargetTypeNames 要求每个条目都完全限定,并指定其程序集名称。 此外,在使用多个并发版本时,版本号也必须追加到目标类型名称。

使用 TargetTypes时,可以通过以下 C# 代码演示的方式将每个对象(例如) MyClass添加到列表中。

TargetTypes = new Type[]{typeof(MyClass)}

适用于