2012-03-26 89 views
7

我有一個現有的代碼庫,它通過NetDataContractSerializer將一些簡單的類保留在磁盤上,但不幸的是類不是用[DataContract]而是用[Serializable]來裝飾的。這工作正常,但現在我想添加一些新的屬性到持久化類,同時仍然能夠讀取舊版本生成的文件。反序列化DataContract/Serializable混雜的可選屬性

比方說,這是類:

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

現在,當我反序列化的舊文件,我得到一個例外,因爲它們不包含NewProperty。這是有道理的。所以我想NewProperty被忽略,但雖然有[OptionalField]屬性讓序列化程序忽略缺少的字段,但它不能應用於僅屬性字段。

所以我想我會使用[DataContract][DataMember],它也有IsRequired屬性,但這改變了序列化文件的佈局,並且它不能讀取舊的數據文件。此外,您不能混用[Serializable][DataMember] - 如果序列化程序看到[Serializable]屬性,則忽略[DataMember]指令。

因此,禁止選擇對舊文件進行一次性轉換(可能,但不是我的第一選擇),是否有辦法讓NetDataContractSerializer忽略現有XML序列化對象中的字段?

回答

4

問題是,當使用Serializable屬性時,被序列化的是字段,而不是屬性。由於您使用的是自動屬性,因此這些字段處於隱藏狀態,您無法向其添加屬性。

解決方法很簡單 - 不要使用自動屬性。