其實我有這樣重命名標有一個DataMemberAttribute
[DataContract]
public class Item : IExtensibleDataObject
{
[Browsable(false)]
public virtual ExtensionDataObject ExtensionData { get; set; }
[DataMember]
public string ID { get; set; }
[DataMember]
public string Name { get; set; }
public Item()
: this(String.Empty, String.Empty)
{ }
public Item(string id, string name)
{
ID = id ?? String.Empty;
Name = name ?? String.Empty;
}
}
一個類你可以很容易地進行序列化和反序列化。但現在到了困難的部分:
我的財產Name
重命名爲FullName
和每一個新的XML序列化的文件應該站出來與FullName
,而它仍然有可能在舊文件閱讀。
要獲得新的屬性名出到一個新的文件是很容易的。只需重命名屬性,你就完成了。
爲了兼容性,我會用[DataMember(Name="Name")]
來標記新的屬性名稱,但在這種情況下,如果我把這個類寫回到一個文件中,我得到了寫入的舊名稱。
所以存在有什麼東西在DataContract
,我可以記住我的財產FullName
像
[DataMember(Name="Name")]
[DataMember]
public string FullName { get; set}
也許兩次或有任何其他機制如何,我可以表明,這兩個值可以被寫入這一點,但只有一個寫回來會出來嗎?
我能想象得到的唯一方法是創建一個類LegacyItem
,它沒有功能或類似的東西,但滿足舊的DataContract
。另外還有一些隱式/顯式運算符,用於將我的LegacyItem
轉換爲Item
。最後但並非最不重要的反序列化,我必須做一些測試(也許只是一個簡單的try/catch
)找出類我應該告訴DataContractSerializer
的讀取文件。
所以,即使這種做法將有可能聽起來這個任務有點過於複雜,我想知道,如果沒有框架內已有的東西,這將使這個任務稍微容易一些。
首先感謝回答這個老問題。我也已經用數據成員屬性和名稱參數裝飾了後備字段。目前我也使用某種過時的字段,但不要使用它的setter來重定向。相反,我添加了一個'OnDeserialized'方法來執行* translation *到新結構中。所以我可以更好地控制字段的設置順序,或者更容易調用一些內部幫助器方法。 – Oliver 2014-01-29 07:09:11