gpt4 book ai didi

c# - ActiveMQ - 反序列化 ActiveMQBytesMessage 消息

转载 作者:太空宇宙 更新时间:2023-11-03 14:02:00 25 4
gpt4 key购买 nike

在我的工作中,我使用部分使用 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

[NB] 我的 C# 应用程序的目标是简单地监视 ActiveMQ channel 内发生的事情。这就是为什么我需要反序列化 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 ...

最佳答案

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

如果所有这些都没有帮助,或者假设是错误的并且您使用的是托管 C++,也许这个问题/答案会对您有所帮助:What serialization method is used for an ActiveMQ NMS C# object message?

关于c# - ActiveMQ - 反序列化 ActiveMQBytesMessage 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10498101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com