好的,所以我对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;
}
答案 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
!