2016-06-11 4 views
1

私はちょっとした問題がありますが、これは最初からより良いコードデザインで解決されているはずです。しかし、私はここにいる。デシリアライズ時のデフォルトのプロパティのデフォルト値

私はかなり大きなユーザーベースのアプリを持っています。アプリはプロファイルを使用します。プロファイルは、アプリケーションを起動するときにファイルからデシリアライズされます。

新しいリリースでは、プロファイルクラスが新しいプロパティを取得することがあります。プロファイルが古いバージョンから非直列化された場合、これらのプロパティは初期化されません。プロファイルが現在のバージョンのアプリケーションで作成されている場合、デフォルトの値が設定されます。

シリアル化されたバージョンにデフォルト値がない場合、プロパティを初期化する簡単な方法はありますか?

+1

シリアライザによって異なります – Plutonix

+0

BinaryFormatterを使用してバイナリシリアル化を行っています。 – Christoffer

答えて

1

あなたはデフォルト値を設定することができどこデシリアライズした後に実行するメソッドを指定することができます。

using System.Runtime.Serialization; 

[Serializable] 
class Car 
{ 
    public int Id { get; set; } 
    public string Make { get; set; } 
    public int Doors { get; set; } 

    public string Foo { get; set; } // added property 

    ... 
    [OnDeserialized()] 
    internal void OnDeserializedMethod(StreamingContext context) 
    { 
     if (string.IsNullOrEmpty(this.Foo)) 
      this.Foo = "Ziggy"; 
    } 
} 

あなたはデータコントラクトバイナリシリアライザでいるProtobuf-NETを検討する必要があります。これらのこと、選択肢が増え、スピードが速く、出力が小さくなります。私は確かにダブルチェックし、ProtoBufは情報を持っていないフィールドを元に戻しません。だから、:

[ProtoContract] 
class Car 
{ 
    [ProtoMember(1)] 
    public int Id { get; set; } 
    [ProtoMember(2)] 
    public string Make { get; set; } 
    [ProtoMember(3)] 
    public int Doors { get; set; } 
    [ProtoMember(4)] 
    public string Foo { get; set; }  // new prop 

    public Car() 
    { 
     this.Foo = "Ziggy"; 
    } 
    ... 
} 

Fooにはシリアル化された値が存在しない場合は、CTORから古い値が保持されます。だから、そこに新しいプロパティを初期化し、nullにリセットされる心配はありません。 BitmapFontRectangleのような多くのプロパティをお持ちの場合は、BinaryFormatterに泊まりたい場合があります。

+0

ありがとう@plutonix。今のところ、最初のソリューションは素晴らしい作品です。 intsのために私はちょうどintと行く?私は彼らが否定されているかどうか確認することができます。しかし、私はProtoBuf-NETを確実にチェックアウトします。私が持っている別の問題は、時々私は新しいバージョンでプロパティを削除し、シリアル化がクラッシュする(それは既存のプロパティを設定しようとしないので)ということです。多分、これもそのような状況に役立つでしょうか? – Christoffer

+1

プロパティの削除は問題になります。もう存在しません。あなたはちょっとコードにそれを残す必要があります。 Nullableではなく、新しいプロパティのデフォルトを設定したり、新しいバージョンコードを設定したりするために、バージョンコードを含めることができます。 ProtoBufはその属性に設定されているIDを使用していますので、Fooを削除した場合、近いうちにID 4を再利用しない限り、すべて正常です。 – Plutonix

関連する問題