在我的工作中,我使用部分用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频道内发生的事情。这就是我需要反序列化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 ... < / p>
答案 0 :(得分:1)
(我在这里做了一些假设,因为你没有指定某些细节。)你试图使用的BinaryFormatter只适用于.NET对象,而不适用于C ++对象。最有可能的是,这些对象尚未以平台中立的方式编码,并且采用特定于该特定编译器和平台的C ++格式。因此,您可以直接解析二进制代码以确定编码的对象,然后手动解码数据。如果这些是非平凡的对象,这将是一项艰巨的任务。如果可能的话,尝试让原始应用程序将对象编码为平台中立格式,可以在C#中轻松解析和实例化。 (我更喜欢使用TextMessage和XML编码。)它不会像现在显然正在进行的直接C ++到C ++编码/解码那样高效,但它将允许外部监视消息流。当我这样做时,我将对象的完整typename(包括名称空间)放在NMSType标头属性中。然后,这告诉我消息内容的内部结构,我可以实例化正确的对象,以便从消息中解析数据。
如果所有这些都无济于事,或者假设错误并且您使用的是托管C ++,那么这个问题/答案可能会对您有所帮助:What serialization method is used for an ActiveMQ NMS C# object message?