2012-05-08 6 views
1

В моей работе я работаю с приложением, разработанным частично в C++ и C#. Код C++ отвечает за управление activeMQ (отправить, получить сообщение).ActiveMQ - десериализация сообщения ActiveMQBytesMessage

Я разработал приложение для мониторинга сообщений, отправленных в теме, подписавшись на мое приложение C#.

Поэтому, когда сообщение отправляется по теме, моему приложению удается обрабатывать сообщение, но сообщение сериализуется в ActiveMQBytesMessage.

Как можно десериализовать этот объект?

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

Я просто заметил, что ActiveMQBytesMessage наследует IBytesMessage из пространства имен Apache.NMS, но я не вижу ничего, что помогает мне десериализации сообщения.

Я использую последнюю версию ActiveMQ с NMS

[NB] Цель моего C# приложения просто контролировать то, что происходит внутри канала ActiveMQ. Вот почему мне нужно десериализовать ActiveMQBytesMessage, чтобы я мог отображать имя объекта и его содержимое в gridview.

[Добавлено больше информации]

Вот что я пытался десериализации.

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

memoryStream.Position = 0; 

var deserializedMessage = binaryFormatter.Deserialize(memoryStream); 

И я получаю эту ошибку, когда десериализует:

Входной поток не является допустимым двоичный формат. Начальное содержание (в байтах): 00-00-00-00-00-00-4F-8C-00-00-00-09-00-00-00-00-54 ...

+0

Вам необходимо предоставить больше контекста. Что вы сериализуете и откуда. Естественно, что что-то, отправленное с C++, не собирается просто десериализоваться в объект C#, и это ваш вопрос, который звучит так, как вы пытаетесь сделать. Более подробная разбивка вашей проблемы поможет вам получить лучший ответ. –

+0

Привет Тим, сериализованный объект может быть чем угодно. То, что я видел до сих пор, заключается в том, что большую часть времени C++ (управляемый) отправляет объект C#, который я могу ссылаться в своем проекте на десериализацию. Есть ли что-то еще, что я могу предоставить, чтобы прояснить контекст?Не стесняйтесь спрашивать меня, пожалуйста. – Gui

+0

Вы пробовали 'var deserializedMessage = binaryFormatter.Deserialize (новый RemotingSurrogateSelector(), memoryStream);'? –

ответ

1

(Здесь я делаю несколько предположений, так как вы не указали некоторые детали.) BinaryFormatter, который вы пытаетесь использовать, будет работать только для объектов .NET, а не для объектов C++. Скорее всего, эти объекты не были закодированы на платформе нейтральным образом и находятся в формате C++, специфичном для этого конкретного компилятора и платформы. Таким образом, вам решать разобрать двоичный код непосредственно, чтобы определить, какой объект закодирован, а затем вручную декодировать данные. Если это нетривиальные объекты, это будет непростой задачей. Если это вообще возможно, попробуйте заставить исходное приложение закодировать объекты в нейтральный формат платформы, который может быть легко проанализирован и создан на C#. (Я предпочитаю использовать TextMessage и XML-кодировку.) Это будет не так эффективно, как прямое кодирование/декодирование с C++ до C++, которое, по-видимому, происходит прямо сейчас, но это позволит осуществлять внешний мониторинг потока сообщений. Когда я это делаю, я помещаю полное имя типа (включая пространство имен) объекта в свойство заголовка NMSType. Затем он сообщает мне внутреннюю структуру содержимого сообщения, и я могу создать экземпляр правильного объекта для разбора данных из сообщения.

Если все это не помогает, или предположение неверно, и вы используете Managed C++, возможно, этот вопрос/ответ поможет вам: What serialization method is used for an ActiveMQ NMS C# object message?

 Смежные вопросы

  • Нет связанных вопросов^_^