MSMQ пустой объект в теле сообщения - PullRequest
0 голосов
/ 21 марта 2010

Хорошо, я очень ОЧЕНЬ плохо знаком с MSMQ и уже запутался.

Я создал личную очередь и добавил к ней несколько сообщений, пока все хорошо.НО, когда я получаю сообщения обратно из очереди, тело сообщения содержит пустой объект того типа, который я добавил.Под этим я не подразумеваю, что тело имеет значение 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;
}

Ответы [ 2 ]

2 голосов
/ 21 марта 2010

Конструктор сообщений использует сериализацию 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...
}
0 голосов
/ 12 апреля 2019

Кроме того, убедитесь, что ваш пользовательский Message объект имеет открытый setters для каждого свойства!

...