8

を介していくつかの単純なクラスをディスクに永続化する既存のコードベースNetDataContractSerializerがありますが、残念ながらクラスは[DataContract]ではなく で装飾されてい[Serializable]ます。これは問題なく動作しますが、古いバージョンで生成されたファイルを引き続き読み取ることができるようにしながら、永続化されたクラスにいくつかの新しいプロパティを追加したいと考えています。

これがクラスだとしましょう:

[Serializable]
public class Persisted
{
    public int OldProperty {get;set;}
    public int NewProperty {get;set;}
}

ここで、古いファイルを逆シリアル化すると、含まれていないため例外が発生しますNewProperty。意味あり。NewPropertyしたがって、無視したかったの[OptionalField]ですが、欠落しているフィールドをシリアライザーに無視させる属性がありますが、プロパティには適用できません-フィールドのみです。

したがって、プロパティも持つ[DataContract]andを使用することにしましたが、これによりシリアル化されたファイルのレイアウトが変更され、古いデータ ファイルを読み取ることができなくなります。さらに、混在させることはできません。シリアライザーが属性を認識した場合、ディレクティブは無視されます。[DataMember]IsRequired[Serializable][DataMember][Serializable][DataMember]

では、古いファイルを 1 回だけ変換するオプション (可能ですが、私の最初の選択ではありません) を除いて、既存の XML シリアル化オブジェクトのフィールドを無視するように NetDataContractSerializer を取得する方法はありますか?

4

1 に答える 1

6

問題は、Serializable属性を使用する場合、シリアル化されるのはプロパティではなくフィールドであることです。自動プロパティを使用しているため、フィールドは非表示になり、属性を追加できません。

解決策は簡単です - 自動プロパティを使用しないでください。

于 2012-04-22T11:13:09.813 に答える