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#?