2012-05-08 1 views
1

Dans mon travail, je travaille avec une application développée en partie en C++ et en C#. Le code C++ est responsable de la gestion activeMQ (envoi, réception de message).ActiveMQ - désérialiser un message ActiveMQBytesMessage

J'ai développé une application pour surveiller les messages envoyés dans le sujet en m'abonnant avec mon application C#.

Ainsi, lorsqu'un message est envoyé à un sujet, mon application parvient à gérer le message, mais le message est sérialisé dans ActiveMQBytesMessage.

Comment désérialiser cet objet?

public void OnMessage(IMessage message) 
    { 
     if (message != null) 
     { 
      var content = (message as ActiveMQBytesMessage).Content; // This is a byte[], I tried to deserialize using BinaryFormatter but it throws an exception, I can't write it here because I'm at home. 
     } 
    } 

Je viens de remarquer que hérite ActiveMQBytesMessage IBytesMessage de Apache.NMS d'espace de noms, mais je ne vois rien qui me permet de désérialiser le message.

J'utilise la dernière version de ActiveMQ avec NMS

[NB] L'objectif de mon application C# est de simplement surveiller ce qui se passe à l'intérieur d'un canal ActiveMQ. C'est pourquoi j'ai besoin de désérialiser l'ActiveMQBytesMessage afin que je puisse afficher le nom de l'objet et son contenu dans un gridview.

[Ajout d'informations]

Voici ce que j'ai essayé de désérialiser.

var memoryStream = new MemoryStream((message as ActiveMQBytesMessage).Content); 
var binaryFormatter = new BinaryFormatter(); 

memoryStream.Position = 0; 

var deserializedMessage = binaryFormatter.Deserialize(memoryStream); 

Et je reçois cette erreur quand il désérialise:

Le flux d'entrée est un format binaire valide. Le contenu de départ (en octets) est: 00-00-00-00-00-00-4F-8C-00-00-00-00-00-00-00-00-54 ...

+0

Vous devez fournir plus de contexte. Qu'est-ce que vous sérialiser et d'où? Naturellement, quelque chose envoyé à partir de C++ ne va pas simplement se désérialiser en un objet C#, ce qui est ce que votre question donne l'impression que vous essayez de faire. Une ventilation plus détaillée de votre problème vous aidera à obtenir une meilleure réponse. –

+0

Salut Tim, l'objet sérialisé peut être n'importe quoi. Ce que j'ai vu jusqu'ici, c'est que la plupart du temps le C++ (géré) envoie un objet C# que je peux référencer dans mon projet pour le désérialiser. Y a-t-il autre chose que je puisse fournir pour clarifier le contexte?N'hésitez pas à me demander s'il vous plaît. – Gui

+0

Avez-vous essayé 'var deserializedMessage = binaryFormatter.Deserialize (nouveau RemotingSurrogateSelector(), memoryStream);'? –

Répondre

1

(Je fais quelques hypothèses ici, puisque vous n'avez pas spécifié certains détails.) Le BinaryFormatter que vous essayez d'utiliser ne fonctionnera que pour les objets .NET, pas pour les objets C++. Très probablement, ces objets n'ont pas été codés de manière neutre pour la plate-forme et sont dans un format C++ spécifique à ce compilateur et à cette plate-forme particulière. Par conséquent, il vous appartient d'analyser le code binaire directement pour déterminer quel objet est codé, puis de décoder manuellement les données. Si ce sont des objets non triviaux, ce sera une tâche difficile. Dans la mesure du possible, essayez d'obtenir que l'application d'origine code les objets dans un format neutre pour la plate-forme qui peut être facilement analysé et instancié en C#. (Je préfère utiliser un encodage TextMessage et XML.) Il ne sera pas aussi efficace que le codage/décodage direct C++ vers C++ qui se passe apparemment en ce moment, mais il permettra une surveillance externe du flux de messages. Lorsque je fais cela, je mets le nom complet (y compris l'espace de noms) de l'objet dans la propriété header NMSType. Cela me dit alors la structure interne du contenu du message, et je peux instancier l'objet correct pour analyser les données hors du message.

Si tout cela ne suffit pas, ou l'hypothèse est fausse et que vous utilisez Managed C++, peut-être cette question/réponse vous aidera: What serialization method is used for an ActiveMQ NMS C# object message?

Questions connexes