Python で実行しているアプリケーションからバイナリ ストリームを受信しています。
バイナリ ストリームから、バイト配列のストリーム内にある C# オブジェクトを作成したいと考えています。
オブジェクトを逆シリアル化し、バイナリ ストリームからオブジェクトを取得するにはどうすればよいですか?
これが Python アプリケーションであることは無視できます。私は、バイナリ ストリーミングがどのように機能するかにより興味があります。
あなたは、すべての言語が自動的に同じシリアル化スキームを使用すると考えているようです。
そうではありません。
プログラミング言語が異なれば、オブジェクトであることの意味が異なるため、理論的にも不可能です。
C# で Python のシリアル化されたストリームを読み取る方法に特に興味がある場合は、それを尋ねてください。そうでなければ、この質問は誤った前提に基づいているため、答えられません。
フォローアップ- 好奇心から、C# で Python の pickle リーダーを検索してみました。検索結果の最初の 3 ページには何もありませんでしたが、C++ のピクル リーダーへの参照がありました。
C# オブジェクト
C# にはオブジェクトがありません。これは .Net オブジェクトです。
第二に、それが Python アプリケーションであることを絶対に無視することはできません。これは、.Net 上で実行されていない可能性が高いことを意味するため、.Net バイナリ形式は Python ランタイムにネイティブではないためです。この場合、.Net シリアライゼーションを利用できないと言っているわけではありません。なぜなら、IronPython (.Net python 実装) を実行している場合は、その中からバイナリ シリアライゼーション API を使用して取得できるからです。シリアル化された.Net オブジェクト。
ただし、別のプラットフォームで実行されている Python の場合は、バイナリ ストリーム内の情報をデコードできます。そのためには、フォーマットを知る必要があります。そのためには、馬の口に直行して、バイナリ フォーマット データ構造の仕様を読んでください。 MSDN から。
もちろん、これには(かなり多くの)作業が必要になります。
取り組んでいるプロジェクトで、元のオブジェクトをシリアル化する方法を変更できる場合は、XML シリアル化または同様のもの (移植可能に設計されている) に変更することを強くお勧めします。
少し一般的な情報を追加するだけです:
C#/.Net では、オブジェクトをバイナリ形式ではなくシリアル化する一般的なアプローチがあります。これは、バイナリ形式にはメタデータを含めるために多くのプロトコルのようなヘッダーが必要であり、これにより受信者が .Net を知る必要があるためです。 /CLR 内部構造は非常に良好です。
代わりに、現在、オブジェクトは通常、XML (型情報が重要な場合) または JSON 形式 (データのみが重要な場合) にシリアル化されているため、受信者は非常に簡単に読み取ることができ、多くの場合、サードパーティは新しいオブジェクトを簡単に生成できます。 -誰がどのプラットフォームで生成したかに関係なく、アプリケーションが「逆シリアル化」する可能性のあるデータのようなデータ。
ただし、バイナリ シリアル化は引き続き使用されます。XML/JSON データは、圧縮されていても、通常はバイナリ イメージよりも大きくなります。ただし、データを外部に公開したくない場合、またはアセンブリを使用して .Net 上でのみ処理されることが魔法のようにわかっている場合は、バイナリ シリアル化が厳密に使用されます。