天天看點

MSMQ(3)——複雜的消息及系統提供的序列化器

複雜消息的消息隊列實作及空間下的三種序列化器介紹

先做一個例子

1定義Customer類

public class Customer

{

public int Unid { get; set; }

public string CustomerName { get; set; }

public DateTime CreateTime { get; set; }

}

3個屬性

2向隊列發送

public void SendMessage(Customer customer)

    MessageQueue _queue = CreateQueue();

    Message _message = new Message(customer);

_message.Formatter =

new XmlMessageFormatter(new Type[] {typeof(Customer) });

    _queue.Send(_message);   

這裡因為用到複雜消息傳遞不是簡單的基元類型是以要用到序列化。序列化為了傳輸和存儲進行的轉換。.net提供了一些序列化工具同時還能利用其它的第三方的工具來序列化和反序列化複雜對象。

對于消息隊列的序列化系統提供了三種工具

·XmlMessageFormatter 對象使用可讀的 XML 字元串将對象和基中繼資料類型保持到消息中和從消息中取消保持。這是 MessageQueue 元件的預設格式化程式設定。

·BinaryMessageFormatter 對象将一個或多個連接配接的對象保持到序列化流中。其結果分析起來非常簡潔快速但人們無法閱讀。

·ActiveXMessageFormatter 對象保持基中繼資料類型進而實作與使用“消息隊列”早期版本的元件的互動。産生的序列化非常簡潔。此格式化程式在設計時考慮了 Windows并且不會産生人們可以閱讀的結果。但它卻是一種極為快捷的序列化方法。

這個後邊說。

3從隊列中得到消息并解析

有了序列化還要有反序列化從傳輸和存儲中得到想要的對象。例如Customer對象

public Customer GetMessage()

   _queue.Formatter =

    new XmlMessageFormatter(new Type[] { typeof(Customer) });

    Message _message = new Message();

    _message = _queue.Peek();

    return _message.Body as Customer;

對于XmlMessageFormatter的用法構造器請見相關幫助文檔。這裡為MessageQueue對象的Formatter屬性指定序列化器。

這裡從隊列中讀取消息我用的是Peek方法它在讀取後不改動隊列。這樣便于測試。

4測試

發送

Customer _customer = new Customer

 { Unid = 2,

CustomerName = "Song江",

CreateTime = Convert.ToDateTime("2010-2-2")

 };

mm.SendMessage(_customer);

接收并列印資訊

Console.WriteLine(mm.GetMessage().CustomerName);

這裡給出在XmlMessageFormatter序列化器的使用下的MSMQ包的内容在預設情況下也就是建立消息隊列對象MessageQueue對象下如果不指定序列化器則在建立MessageQueue時同時建立XmlMessageFormatter并将兩者關聯

<?xml version="1.0" ?>

<Customer

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchema">

     <Unid>2</Unid>

     <CustomerName>Son gæ±</CustomerName>

     <CreateTime>2 010-02-02 T00:00:00</CreateTime>

</Customer>

因為之中用到了中文文字編碼的原因這裡看來是亂碼。

5三種序列化器

1》XmlMessageFormatter

預設的序列化器在建立MessageQueue對象時同時建立并關聯到消息隊列對象。這裡這個簡稱為xml序列化器。

xml序列化器可用于寫入隊列但如果要從隊列中讀取先要對設定TargetTypes或TargetTypeNames屬性可以同時設定這兩個屬性。也可以建立xml序列化器的執行個體然後通過值參方式建立xml序列化器。

XmlMessageFormatter.TargetTypes

指定可能的類型集這些類型将由格式化程式從提供的消息進行反序列化。

定義

public Type[] TargetTypes { get; set; }

XmlMessageFormatter.TargetTypeNames

public string[] TargetTypeNames { get; set; }

在預設情況下xml序列化器被建立并使用可以用來傳遞消息。但如果要從隊列中讀取消息需要在讀取之前顯示對序列化器進行設定

·設定xml序列化器的TargetTypes屬性或TargetTypeNames屬性。

MessageQueue _queue = CreateQueue();

_queue.Formatter =

new XmlMessageFormatter(new Type[] { typeof(Customer) });

·通過值參數來建立xml序列化器。

XmlMessageFormatter _formatter = new XmlMessageFormatter();

_formatter.TargetTypes = new Type[] { typeof(Customer)};

_queue.Formatter = _formatter;

2》BinaryMessageFormatter

使用二進制将對象進行序列化和反序列化。這個簡稱二進制序列化器。

二進制序列化器非常有效且可用于大多數對象的序列化。序列化後的結果緊湊且可以快速分析但不允許進行松耦合消息處理。松耦合意味着用戶端和服務端可以獨立控制發送和接收的類型的版本。這個二進制速度快。二進制我最愛

這裡給出一段經過二進制序列化器序列化的消息的包内容

.....ÿÿÿÿ......... ....?Self MSMQ,

Ver sion=1.0. 0.0, Culture=neutral,

PublicKeyToken=null....

 ..SelfMSMQ.Customer.....

<Unid>k__Bac kingField .

<CustomerName>k__ BackingField.

<CreateTime>k__BackingField...................Song æ±

...̱qÌ..

在使用時将上例中的xml序列化器換成二進制序列化器就可以了。二進制速度快吞吐量大。

3》ActiveXMessageFormatter

使用與 MSMQ ActiveX 元件相容的格式将基中繼資料類型和其他對象序列化成“消息隊列”消息體或從“消息隊列”消息體反序列化基中繼資料類型和其他對象。與使用消息隊列 COM 元件發送的消息相容并允許與使用消息隊列 COM 控件的應用程式進行互操作。

它的序列化與反序列化有要求可以序列化大多數基元類型以及實作 IPersistStream OLE 接口的對象。它可以反序列化相同的基元類型集但在反序列化實作 IPersistStream 的 COM 對象例如使用 Visual Basic 6.0 建立的對象時需要進行更多的工作。要反序列化的對象必須處于記憶體中通過首先将對象導入到 .NET Framework 應用程式中。

現在通過這個序列化器進行對字元串的序列化與反序列化。

這裡寫一個小例子

public void SendMessage(string strMsg)

    Message _message = new Message(strMsg);

    _message.Formatter = new ActiveXMessageFormatter();

接收

public string ReceiveMessage()

    Message _message = _queue.Peek();

    return _message.Body.ToString();

測試

mm.SendMessage("這裡ActiveX序列化器");

……

Console.WriteLine(mm.ReceiveMessage());

列印這裡ActiveX序列化器

對于這個包内容這裡不給出了。

部落格園大道至簡

http://www.cnblogs.com/jams742003/

轉載請注明部落格園