ActiveMQ - 反序列化 ActiveMQBytesMessage 消息

本文关键字:消息 ActiveMQBytesMessage 反序列化 ActiveMQ | 更新日期: 2023-09-27 18:33:26

在我的工作中,我使用了一个部分用 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从命名空间Apache.NMS继承了IBytesMessage,但我没有看到任何帮助我反序列化消息的东西。

我使用最新版本的ActiveMQ和NMS

[注意] 我的 C# 应用程序的目标是简单地监视 ActiveMQ 通道内发生的情况。这就是为什么我需要反序列化 ActiveMQBytesMessage,以便我可以在网格视图中显示对象的名称及其内容。

[新增更多信息]

这是我试图反序列化的内容。

var memoryStream = new MemoryStream((message as ActiveMQBytesMessage).Content);
var binaryFormatter = new BinaryFormatter();
memoryStream.Position = 0;
var deserializedMessage = binaryFormatter.Deserialize(memoryStream);

它反序列化时,我收到此错误:

输入流不是有效的二进制格式。起始内容(以字节为单位(为:

ActiveMQ - 反序列化 ActiveMQBytesMessage 消息

00-00-00-00-00-00-4F-8C-00-00-00-09-00-00-00-00-00-54 ...
(

我在这里做一些假设,因为你没有指定某些细节。 您尝试使用的 BinaryFormatter 仅适用于 .NET 对象,不适用于C++对象。 最有可能的是,这些对象尚未以平台中立的方式进行编码,并且采用特定于该特定编译器和平台的C++格式。 因此,由您直接解析二进制代码以确定要编码的对象,然后手动解码数据。 如果这些是非平凡的对象,这将是一项艰巨的任务。 如果可能,请尝试让原始应用程序将对象编码为平台中立格式,该格式可以在 C# 中轻松分析和实例化。 (我更喜欢使用文本消息和XML编码。 它不会像现在显然正在进行的C++编码/解码的直接C++那样有效,但它将允许对消息流进行外部监控。 执行此操作时,我将对象的完整类型名(包括命名空间(放在 NMSType 标头属性中。 然后,这告诉我消息内容的内部结构,我可以实例化正确的对象来解析消息中的数据。

如果所有这些都没有帮助,或者假设是错误的,并且您使用的是托管C++,也许这个问题/答案会对您有所帮助:ActiveMQ NMS C# 对象消息使用哪种序列化方法?