C# ActiveMQ-反序列化ActiveMQByteMessage消息 在我的工作中,我使用的是一个部分在C++和C语言中开发的应用程序。C++代码负责管理ActuMeq(发送、接收消息)。

C# ActiveMQ-反序列化ActiveMQByteMessage消息 在我的工作中,我使用的是一个部分在C++和C语言中开发的应用程序。C++代码负责管理ActuMeq(发送、接收消息)。,c#,activemq,nms,C#,Activemq,Nms,我开发了一个应用程序,通过订阅我的C#应用程序来监视主题中发送的消息 因此,当消息发送到主题时,我的应用程序会设法处理该消息,但该消息会在ActiveMQBytesMessage中序列化 如何反序列化此对象 public void OnMessage(IMessage message) { if (message != null) { var content = (message as ActiveMQBytesMessage).C

我开发了一个应用程序,通过订阅我的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.
        }
    }
我刚刚注意到ActiveMQByteMessage从名称空间Apache.NMS继承了IBytesMessage,但我没有看到任何有助于反序列化消息的内容

我在NMS中使用最新版本的ActiveMQ

[NB]我的C#应用程序的目标是简单地监视ActiveMQ通道内发生的事情。这就是为什么我需要反序列化ActiveMQByteMessage,以便在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—4—F—4—C—0—0—0—9—0—0—0—0~0~0/P><(P)>(我在这里做了一些假设,因为你没有指定某些细节)。你要用的BinaryFormatter只对.NET对象工作,而不是C++对象。最可能的是,这些对象没有以平台中立的方式编码,并且以特定于该编译器和平台的C++格式。因此,由您直接解析二进制代码以确定编码的对象,然后手动解码数据。如果这些是非平凡的对象,这将是一项困难的任务。如果可能的话,试着让原始应用程序将对象编码成一种平台无关的格式,这种格式可以很容易地用C#进行解析和实例化。(我更喜欢使用TeXMeMeX和XML编码)它不会像现在正在进行的直接C++到C++的编码/解码那样高效,但是它允许对消息流进行外部监控。执行此操作时,我将对象的完整typename(包括命名空间)放入NMSType header属性中。然后,这会告诉我消息内容的内部结构,我可以实例化正确的对象来解析消息中的数据


如果所有这些都没有帮助,或者假设是错误的,而你使用的是管理C++,也许这个问题/答案会帮助你:

你需要提供更多的上下文。你在序列化什么,从哪里开始。当然,从C++发送的东西不会只是反序列化成C对象,这就是你的问题听起来像你正在尝试做的。对你的问题进行更详细的分解将帮助你得到更好的答案。嗨,蒂姆,序列化对象可以是任何东西。迄今为止我所看到的是,大多数时候,C++(托管)发送一个C对象,我可以在我的项目中引用它来反序列化。我还可以提供什么来澄清上下文?请随时问我。您是否尝试过
var deserializedMessage=binaryFormatter.Deserialize(新的RemotingSurrogateSelector(),memoryStream)?您好,david.s,您的指令中有一个错误。反序列化方法不接受RemoteSurrogateSelector()类型的对象