2012-07-24 36 views
0

發送客戶定義的類型鑑於這一事件如何通過的MessageQueue

public class DummyEvent : EventDTO{ 
    public CustomUUID Cid { get; set; } 
    public DateTime Date { get; set; } 
    public Guid Id { get; set; } 
} 

我通過MSMQ發送消息:

var de = new DummyEvent { 
           Date = DateTime.UtcNow, 
           Id = Guid.NewGuid(), 
           Cid = Guid.NewGuid() 
          }; 
var mq = new MessageQueue(AppSettings.EventQueue);        
mq.Formatter = new XmlMessageFormatter(new[]{de.GetType()}); 
mq.Send(de); 
var e = reciever.Receive().Body; 

日期是的System.DateTime所以它被反序列OK
ID是System.Guid所以它得到反序列化ok
Cid是CustomUUID這是用戶定義的類型,不得到反序列化

我也需要發送客戶定義的類型,但網絡上的稀缺信息。

編輯:它實際上沒有被序列化,所以這個問題是在發送消息

+0

請看看這裏的http://blog.goyello .com/2009/09/08/why-msmq-is-excelent-for-net-developers/ – GSerjo 2012-07-25 19:40:44

+0

這傢伙只使用字符串道具。我需要發送我自己定義的類型,其中包含一些其他自定義類型。我可以將它自己序列化爲一個Dictionary ,但格式化程序除了衍生自IDictonary的任何內容外都不會。所以我把所有的屬性的格式'key = value',併發送消息作爲字符串[]。 – zirus 2012-07-30 13:35:23

回答

2

這裏是樣品

using System; 
using System.Messaging; 

namespace MsmqSample 
{ 
    internal class Program 
    { 
     private static MessageQueue _queue; 
     private static readonly BinaryMessageFormatter _formatter = new BinaryMessageFormatter(); 

     private static void Main(string[] args) 
     { 
      const string queueName = @".\private$\TaskQueue"; 
      if (!MessageQueue.Exists(queueName)) 
      { 
       MessageQueue.Create(queueName, true); 
      } 
      _queue = new MessageQueue(queueName); 
      _queue.Purge(); 
      AddMessage(); 
      Console.ReadKey(); 
     } 

     private static void AddMessage() 
     { 
      using (var transaction = new MessageQueueTransaction()) 
      { 
       try 
       { 
        transaction.Begin(); 
        var externalMessage = new ExternalMessage {Data = "Test Data"}; 
        _queue.Send(new Message(externalMessage, _formatter), transaction); 
        transaction.Commit(); 
       } 
       catch (Exception) 
       { 
        transaction.Abort(); 
       } 
      } 
     } 
    } 

    [Serializable] 
    public class ExternalMessage 
    { 
     public string Data; 

     public ExternalMessage() 
     { 
      Content = new MessageContent {Guid = Guid.NewGuid()}; 
     } 

     public MessageContent Content { get; set; } 
    } 

    [Serializable] 
    public class MessageContent 
    { 
     public Guid Guid { get; set; } 
    } 
}