2010-07-20 54 views
2

我有一組使用[Serializable]屬性的類。我需要在WCF服務中公開它們,所以我需要它們具有[DataContract]屬性。它只適用於Serializable,但後來這些屬性變得有趣的名字,如... k__BackingField。將[Serializable]更改爲[DataContract]

這些類也用於其他地方,我想知道是否冒險通過替換屬性來破壞任何東西。另外,這是可能的,並且它們是否是一個好主意?

謝謝。

回答

5

當您只是指定一個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序列化屬性。

+0

謝謝 - 我必須保持與現有的可利用的XmlSerializer,所以我想我唯一的選擇是花費了自動屬性代碼的兼容性。如果我同時使用這兩個屬性,您能否詳細說明可能出現的問題?我希望XmlSerializer忽略DataContract屬性和其他方式? – 2010-07-20 03:04:09

+0

據我所知,不應該與屬性發生衝突。但是,當涉及到序列化引用,默認值,支持類型,保留空白等等時,這兩個序列化程序的行爲會非常不同。而額外的屬性可能會破壞您的類。但從技術上講,我不會期望有任何衝突。 – Josh 2010-07-20 03:16:55

+0

@Josh Einstein - 用[DataContract]標記的C#類有一個複雜類型,即自定義對象,它的類定義有一個[Serializable]屬性是什麼後果? – 2012-01-16 19:33:51

相關問題