2

デシリアライズ/シリアライズにのみ必要なデータを格納するためにクラスにフィールドを追加することを回避できますか?

私がいくつかのクラスを持っているとしましょう:

[Serializable]
class MyClass {
      [NonSerialized]
      NonSerializableDataType myField;

      SomeOtherDataType serializableTemporaryData;

      [OnSerializing]
      OnSerializing (StreamingContext context) {
          // build serializableTemporaryData from myField
      }

      [OnDeserialized]
      void OnDeserialized (StreamingContext context) {
         // build myField from serializableTemporaryData
      }
}

serializableTemporaryDataの各オブジェクトにフィールドが含まれないようにする方法はありMyClassますか?たとえば、静的にすることはできますか(おそらく、On ...メソッドを変更することによって)?

制約:の実装を変更することはできませんNonSerializableDataType

例:myFieldにリソースへのハンドルが含まれているとします。次に、シリアル化の際に、逆シリアル化後にリソースを取得する方法に関する情報を保存する必要がありますが、ハンドル自体を保存することはできません。ハンドルを別のクラスにラップすると、問題がラッパークラスに移されただけです。その場合、ラッパークラスについてもまったく同じ質問をします。

4

2 に答える 2

5

シリアル化プロセスを制御する必要がある場合は、ISerializationインターフェースを実装する必要があります。

[Serializable]
public class MyClass: ISerializable
{
    // As you are in control of serialization process now
    // [Serialized] and [NonSerialized] attributes are no longer required
    private NonSerializableDataType myField;

    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        // Create and populate your SomeOtherDataType local variable here, then push it into info variable
        // Or even better, dont create SomeOtherDataType, just put additional serialization data into info variable, for example:
        info.AddValue("URL", "http://this.way.com");
    }

    protected MyClass(SerializationInfo info, StreamingContext context)
    {
        // Dont forget to define constructor for deserialization purpose

        this.myField = new NonSerializableDataType(loadFromURL: (string)info.GetValue("URL", typeof(string)));
    }
}

シリアル化データ専用の追加クラスはなく、フィールドの汚染もありません。唯一の潜在的な問題は、このクラスから派生したシリアル化可能なデータを監視することです(GetObjectData(...)必要に応じて上書きします)。

詳細:MSDN ISerializable

于 2012-09-08T12:43:17.240 に答える
3

シリアル化サロゲートの概念は、SomeNonSerializableTypeまさにこの理由で設計されているため、の問題を克服するのに役立つ可能性があります。ただし、これには、フォーマッターの作成時にシリアル化サロゲートを構成する可能性が必要です。それ以外の場合は、を実装してシリアル化プロセスをカスタマイズする必要がありますISerializable

于 2012-09-08T13:09:57.117 に答える