BinaryFormatter
C# でいくつかのオブジェクトのバイナリ シリアル化を行うために使用しています。ただし、一部のオブジェクトには、DLL を介してアクセスするクラスが含まれており、そのソース コードがないため、それらをSerializable
属性でマークすることはできません。とにかくそれらをシリアル化する簡単な方法はありますか? クラスを取得して、コンストラクターがオブジェクトを取得し、そこから必要なすべての情報を抽出NoSource
する新しいクラスを作成することを含む回避策がありますが、それはハッキーです。より良い代替手段はありますか?SerializableNoSource
NoSource
6 に答える
クラスに を追加するためにMono.Cecilを使用できるかもしれませんが[SerializableAttribute]
、目的の結果を達成する別の方法がある場合はそうしません。
新しいクラスを作成し、シリアル化属性でマークされていない既存のクラスを継承し、ISerializableインターフェイスを実装します。
クラスが封印されている場合は、Json.NETを使用してから、バイナリに変換したり、その逆を行ったりすることができます(非常に時間がかかるので、他に何も役に立たない場合は使用してください:))。
@Servy に同意します。クラスの作成者がシリアル化されることを予期していなかった場合は、直接シリアル化しようとしないでください。つまり、アーキテクチャの観点から正しいことをしているということです。現在のアプローチを「ハッキー」にするために、シリアル化できないオブジェクトへの参照を含むクラスにISerializableを実装することを検討してください。
よりクリーンな方法は、ISerializable Interface を実装し、シリアル化と逆のプロセスを自分で管理することだと思います。MSDN には次のようなものがあります。
コンパイル後にクラスにシリアライゼーションを追加することはできません....