私はオブジェクトバイナリデータ(プライベートフィールドを含む)を読んで、特定の方法で処理してシリアル化する必要があります。.NET 4でオブジェクトバイナリにアクセスするには?
C#でこれを行うにはどうすればいいですか?MSILコーディングが必要ですか?
私はオブジェクトバイナリデータ(プライベートフィールドを含む)を読んで、特定の方法で処理してシリアル化する必要があります。.NET 4でオブジェクトバイナリにアクセスするには?
C#でこれを行うにはどうすればいいですか?MSILコーディングが必要ですか?
リフレクションと(オプションで)動的IL生成を使用して行うことができます。例えば
あなたがタイプ(すなわちSystem.Type
インスタンスを持っている)を知っていれば、あなたはすべてのフィールド(type.GetFields()
リターンFieldInfo
オブジェクトのリスト)を列挙して、フィールドの値を取得するためにGetValue
メソッドを使用することができます。これは、セキュリティ信頼レベルチェックがパスされている限り、プライベートフィールドで動作します。
これはあまり速くないので、フィールドアクセスコードをプリコンパイルしたい場合があります(プロファイラが指示した後にのみ行います)。この場合、System.Reflection.Emit
とDynamicMethod
の機能を使用できます。 (チュートリアルはGoogleとMSDNで見つけることができますが、C#/ F#で行う必要がある機能をコンパイルし、Reflector/ildasmでMSILの出力を調べると便利です)。
まず、ISerializableを実装します。このインターフェイスでは、シリアル化を手動で制御できます。http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx
protobuf-netがどうしているのですか?彼らは帰属クラスのMSILコードを自動的に追加しているようです – geeko
実際は簡単です。バイナリデータ(シリアル化されていないオブジェクトではなく、生のバイナリデータ)を読み込みたい場合は、BinaryReader
を使用できます。
コンパイル時と実行時にMSILコードを発行/カスタマイズ/操作する良い本はありますか? – geeko
何かがあるかどうかわかりません。 MSDNのdocsとReflectorを使用すると、発光が多かれ少なかれ簡単になります。唯一の問題は、MSILが正しくない場合(スタックの不均衡や不適切なタイプなど)、詳細な説明がなく、「何かが間違っている」という例外があるため、二重と三重にチェックして推測する必要があるということです。だから私はいくつかのコードを書くことをお勧めしたい - あなたはすぐに書籍なしでそれを得るだろう、と思う。 – zeuxcg