3

SerializableAttributeCustomLineCap には が適用されていません。

このタイプのプロパティを、現在シリアライズ/デシリアライズされているオブジェクト グラフに追加したいと考えていますBinaryFormatter

XMLシリアライゼーションに切り替えようとしましたが、余分な要件がたくさんあり、そのespでだまされたくありません。それは私のコードではないので; それは私がダウンロードしたオープンソースです。

BinaryFormatterプロパティを無視する方法があれば、うまくいくかもしれません。

私はそれをサブクラス化したいと思います。それもうまくいくかどうかはわかりません。

4

1 に答える 1

1

CustomLineCapクラスのインスタンスを直接シリアル化することはできません。MarshalByRefObjectこれはclassから派生します。これはシリアライズできないという指標ではありませんが、ほとんどの場合そうです。

その理由は、MarshalByRefObjectクラスは通常、そこから派生したオブジェクトが、インスタンスが存在するアプリケーション ドメインにのみコンテキストを持つことを示す指標であるためです。この場合、CustomLineCapインスタンスはGDI オブジェクトであり、それが存在するプロセスでのみ意味を持ちます (ハンドルに明示的に関連付けられています)。

とはいえ、アダプター パターンを使用して、シリアル化するインスタンスのプロパティをキャプチャするラッパーを作成し、CustomLineCapそれを公開してシリアル化することを勧めします。

これは通常、特定のドメインに関連付けられたコンテキストを持つクラスで採用したいアプローチであり、そのドメインの外で永続化するためにシリアライズされると、もはや意味がありません。

このシナリオでもサブクラス化は機能しないことに注意しSerializableAttributeてください。サブクラスに を適用すると、コンテキストのみを持つハンドルを含め、すべてのフィールド (アクセスできないプライベート フィールドも含む) がシリアル化されます。それらが作成されたアプリケーション ドメイン内。

于 2012-02-07T21:11:30.600 に答える