2010-03-21 5 views
0

Ok, donc je suis très très nouveau à MSMQ et je suis déjà confus.MSMQ objet vide sur le corps du message

J'ai créé une file d'attente privée et y ai ajouté quelques messages, tout va bien jusqu'ici. MAIS lorsque je récupère les messages de la file d'attente, le corps du message contient un objet vide du type que j'ai ajouté. Par ceci je ne veux pas dire que le corps est nul, il a une référence à un type de l'objet que j'ai ajouté, mais il n'est pas instancié de sorte que toutes les propriétés sont dans leur état nul ou par défaut.

C'est le code que j'utilise pour ajouter à la file d'attente:

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

Et ceci est le code qui dequeues les messages:

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

Répondre

2

Le constructeur de message utilise sérialisation XML pour sérialiser votre " observation "objet". Vous devrez vous assurer que cela fonctionne correctement. La sérialisation XML ne traitera qu'avec les membres publics de la classe, elle ne va pas sérialiser les membres privés. Votre objet peut sembler "vide" après avoir été désérialisé à nouveau.

est ici un code de test pour vérifier qu'il fonctionne correctement:

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