ActiveMQ — десериализовать сообщение ActiveMQBytesMessage

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

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

[Добавлена ​​дополнительная информация]

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

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


person John    schedule 08.05.2012    source источник
comment
Вам нужно предоставить больше контекста. Что вы сериализуете и откуда. Естественно, что-то, отправленное из С++, не будет просто десериализоваться в объект С#, что звучит так, как ваш вопрос, как вы пытаетесь сделать. Более подробная разбивка вашей проблемы поможет вам получить лучший ответ.   -  person Tim Bish    schedule 08.05.2012
comment
Привет Тим, сериализованный объект может быть чем угодно. Что я видел до сих пор, так это то, что большую часть времени C++ (управляемый) отправляет объект C#, на который я могу ссылаться в своем проекте для десериализации. Есть ли что-нибудь еще, что я могу предоставить, чтобы прояснить контекст? Не стесняйтесь спрашивать меня, пожалуйста.   -  person John    schedule 08.05.2012
comment
Вы пробовали var deserializedMessage = binaryFormatter.Deserialize(new RemotingSurrogateSelector(), memoryStream);?   -  person david.s    schedule 14.05.2012
comment
Привет, david.s, в твоей инструкции ошибка. Метод Deserialize не принимает объект типа RemoteSurrogateSelector()   -  person John    schedule 14.05.2012


Ответы (1)


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

Если все это не помогает или предположение неверно, и вы используете Managed C++, возможно, вам поможет этот вопрос/ответ: Какой метод сериализации используется для объектного сообщения ActiveMQ NMS C#?

person Jim Gomes    schedule 17.05.2012