2

私の仕事では、部分的に 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 を継承していることに気付きましたが、メッセージを逆シリアル化するのに役立つものは何もありません。

NMS で最新バージョンの ActiveMQ を使用しています

[注] 私の 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 ... です。

4

1 に答える 1

1

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

上記のすべてが役に立たない場合、または仮定が間違っていて Managed C++ を使用している場合は、おそらく次の質問/回答が役立ちます: ActiveMQ NMS C# オブジェクト メッセージに使用されるシリアル化方法

于 2012-05-17T06:31:52.750 に答える