我有一組使用[Serializable]
屬性的類。我需要在WCF服務中公開它們,所以我需要它們具有[DataContract]
屬性。它只適用於Serializable,但後來這些屬性變得有趣的名字,如... k__BackingField。將[Serializable]更改爲[DataContract]
這些類也用於其他地方,我想知道是否冒險通過替換屬性來破壞任何東西。另外,這是可能的,並且它們是否是一個好主意?
謝謝。
我有一組使用[Serializable]
屬性的類。我需要在WCF服務中公開它們,所以我需要它們具有[DataContract]
屬性。它只適用於Serializable,但後來這些屬性變得有趣的名字,如... k__BackingField。將[Serializable]更改爲[DataContract]
這些類也用於其他地方,我想知道是否冒險通過替換屬性來破壞任何東西。另外,這是可能的,並且它們是否是一個好主意?
謝謝。
當您只是指定一個DataContractAttribute但沒有明確指定要包含的成員時,默認行爲是序列化該類的所有字段,包括私有字段。所以你得到的名字是因爲你正在使用自動實現的屬性,我假設。
換句話說,將類定義更改爲類似於以下內容。請注意我想序列化的屬性上的DataMember屬性。
[DataContract]
public class MyClass {
[DataMember]
public string SomeString {
get;
set;
}
[DataMember]
public int SomeInt {
get;
set;
}
public string DontSerializeThis {
get;
set;
}
}
這將導致的DataContractSerializer序列化屬性而不是它們的編譯器生成的支持字段。但是,它確實需要這些屬性是讀/寫公共屬性,因爲它將通過這些屬性訪問器來獲取和設置序列化數據。
另一種選擇是將自動實現的屬性更改爲「普通」屬性,這意味着添加您自己的支持字段。然後,您可以關閉所有DataMember屬性,這意味着它們都將被序列化,或者可以將DataMember屬性添加到您創建的新字段中,以便在需要時在序列化輸出中重命名它們。
最後,關於是否在兩個系統中創建一個可串行化的類是一個好主意,而不是真的。如果您希望該類使用類似BinaryFormatter或XmlSerializer的經典序列化,那麼您應該只是針對該場景,因爲DataContractSerializer可以已經序列化這些類。
如果您的目標是快速,高效,.NET 3+與.NET 3+(或Silverlight)通信,DataContract是最佳選擇。如果您的目標是互操作性和/或對XML表示的控制,請使用XML序列化屬性。
我覺得從喬希愛因斯坦的回答這個代碼摘錄:
public string DontSerializeThis {
get;
set;
}
將導致其支持字段被序列化,因爲在相同的答覆中提到的默認行爲的屬性。它應該是
[IgnoreDataMember]
public string DontSerializeThis {
get;
set;
}
僅供參考,請參閱: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ignoredatamemberattribute.aspx
謝謝 - 我必須保持與現有的可利用的XmlSerializer,所以我想我唯一的選擇是花費了自動屬性代碼的兼容性。如果我同時使用這兩個屬性,您能否詳細說明可能出現的問題?我希望XmlSerializer忽略DataContract屬性和其他方式? – 2010-07-20 03:04:09
據我所知,不應該與屬性發生衝突。但是,當涉及到序列化引用,默認值,支持類型,保留空白等等時,這兩個序列化程序的行爲會非常不同。而額外的屬性可能會破壞您的類。但從技術上講,我不會期望有任何衝突。 – Josh 2010-07-20 03:16:55
@Josh Einstein - 用[DataContract]標記的C#類有一個複雜類型,即自定義對象,它的類定義有一個[Serializable]屬性是什麼後果? – 2012-01-16 19:33:51