10

クラスをシリアライズし、後でデシリアライズする場合、シリアライズさDataContractSerializerれていないプロパティの初期値をどのように制御できますか?

Person以下のクラスを考えてみましょう。そのデータ コントラクトは、FirstNameおよびLastNameプロパティをシリアル化するように設定されていますが、プロパティはシリアル化されていませんIsNewIsNew新しい Person が新しいインスタンスとしてインスタンス化されているか、ファイルから逆シリアル化されているかにかかわらず、TRUE に初期化したいと考えています。

これはコンストラクターを介して簡単に実行できますが、私が理解しているようにDataContractSerializer、パラメーターが必要になる可能性があるため、コンストラクターを呼び出しません。

[DataContract(Name="Person")]
public class Person 
{
    [DataMember(Name="FirstName")]
    public string FirstName { get; set; }

    [DataMember(Name = "LastName")]
    public string LastName { get; set; }

    public bool IsNew { get; set; }

    public Person(string first, string last)
    {
        this.FirstName = first;
        this.LastName = last;
        this.IsNew = true;
    }
}
4

2 に答える 2

20

実際にそれを行う正しい方法は、OnDeserializing属性を使用することです(「ing」サフィックスに注意してください)。この属性でマークされたメソッドは、メンバー値が逆シリアル化される前に呼び出されます。

于 2010-05-19T21:06:32.207 に答える
10

シリアル化コールバックを使用できます。Person クラスに次のメソッドを追加します。

[OnDeserialized]
void OnDeserialized(StreamingContext context)
{
    this.IsNew = true;
}

もう 1 つのオプションは、[DataContract] および [DataMember] 属性を削除することです。この場合、DCSerializer はデシリアライズ時にコンストラクターを呼び出します。

于 2010-04-28T00:04:43.790 に答える