消息体上的MSMQ空对象

时间:2010-03-21 18:34:34

标签: c# msmq

好的,所以我对MSMQ非常陌生,我已经很困惑了。

我已经创建了一个私人队列并向其添加了一些消息,到目前为止一切都很好。但是当我从队列中检索消息时,消息正文包含我添加的类型的空对象。通过这个我并不是说body是null,它确实引用了我添加的对象的类型,但它没有实例化,因此所有属性都处于null或default状态。

这是我用来添加到队列的代码:

using (var mQueue = new MessageQueue(QueueName))
{
    var msg = new Message(observation)
    {
            Priority = MessagePriority.Normal,
             UseJournalQueue = true,
            AcknowledgeType = AcknowledgeTypes.FullReceive,
    };
    mQueue.Send(msg);
}

这是使消息出列的代码:

using (var mQueue = new MessageQueue(QueueName))
{
    mQueue.MessageReadPropertyFilter.SetAll();
    ((XmlMessageFormatter)mQueue.Formatter).TargetTypes =
                                                  new[] { typeof(Observation) };
    var msg = mQueue.Receive(new TimeSpan(0, 0, 5));
    var observation = (Observation)msg.Body;

    return observation;
}

2 个答案:

答案 0 :(得分:2)

Message构造函数使用XML序列化来序列化“观察”对象。你需要确保它正常工作。 XML序列化只处理类的公共成员,它不会序列化私有成员。在再次反序列化后,您的对象可能看起来很“空”。

这是一些测试代码,用于验证它是否正常工作:

using System;
using System.IO;
using System.Xml.Serialization;

class Program {
  static void Main(string[] args) {
    var ser = new XmlSerializer(typeof(Observation));
    var sw = new StringWriter();
    var obj = new Observation();
    ser.Serialize(sw, obj);
    Console.WriteLine(sw.ToString());
    var sr = new StringReader(sw.ToString());
    var obj2 = (Observation)ser.Deserialize(sr);
    // Compare obj to obj2 here
    //...
    Console.ReadLine();
  }
}
public class Observation {
  // etc...
}

答案 1 :(得分:0)

此外,请确保您的自定义Message对象在每个属性上都具有公共setters