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

1 ответ

Решение

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

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

Другие вопросы по тегам