2012-05-08 20 views
1

私の仕事では、部分的にはC++とC#で開発されたアプリケーションで作業します。 C++コードは、activeMQ(sendメッセージ、receiveメッセージ)の管理を担当します。ActiveMQ - ActiveMQBytesMessageメッセージの逆シリアル化

私は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を継承することに気づいたが、私は私がメッセージをデシリアライズすることができます何も表示されません。

私はNMS

とのActiveMQの最後のバージョン[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 ...

+0

あなたはより多くのコンテキストを提供する必要があります。あなたはどこからシリアライズしていますか?もちろん、C++から送信されたものはC#オブジェクトにデシリアライズするだけではありません。これは、あなたの質問があなたがしようとしているように聞こえるようにするものです。あなたの問題の詳細な内訳は、より良い答えを得るのに役立ちます。 –

+0

こんにちはTim、シリアル化されたオブジェクトは何でもかまいません。私がこれまで見たことは、C++(管理対象)がプロジェクトで参照することができるC#オブジェクトをデシリアライズすることがほとんどです。文脈を明確にするために私が提供できるものは他にありますか?私にお願いしてください。 – Gui

+0

あなたは 'var deserializedMessage = binaryFormatter.Deserialize(新しいRemotingSurrogateSelector()、memoryStream);を試しましたか? –

答えて

1

(ここでは、特定の詳細を指定していないので、ここではいくつか前提をしています)。使用しようとしているBinaryFormatterは、C++オブジェクトではなく.NETオブジェクトでのみ機能します。ほとんどの場合、これらのオブジェクトはプラットフォームに依存しない方法でエンコードされておらず、特定のコンパイラとプラットフォームに固有のC++形式です。したがって、バイナリコードを直接解析して、どのオブジェクトがエンコードされているかを判断し、手動でデータをデコードする必要があります。これらが些細なものではない場合、これは難しい作業です。可能であれば、元のアプリケーションでオブジェクトをC#で簡単に解析およびインスタンス化できるプラットフォームの中立形式にエンコードするようにしてください。 (私はTextMessageとXMLエンコーディングを使用する方が好きです。)明らかに現在進行中の直接C++からC++へのエンコーディング/デコードと同じくらい効率的ではありませんが、メッセージストリームの外部モニタリングが可能になります。これを行うと、オブジェクトの完全なtypename(名前空間を含む)をNMSTypeヘッダープロパティに置きます。これにより、メッセージの内容の内部構造がわかり、メッセージからデータを解析するための正しいオブジェクトをインスタンス化できます。

そのすべてが解決しない、または仮定が間違っている、あなたはマネージドC++を使用している場合は、おそらくこの質問/回答はあなたを助ける:What serialization method is used for an ActiveMQ NMS C# object message?

関連する問題