繁体   English   中英

邮件正文上的MSMQ空对象

[英]MSMQ empty object on message body

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

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

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

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;
}

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...
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM