2013-11-14 80 views
20

因此,我一直在通過我們的代碼庫,我看到一些我們的DTO具有[DataMember][IgnoreDataMember]屬性的混合和匹配。沒有[數據成員]屬性與具有[IgnoreDataMember]屬性

過去,我們已經被告知如果我們不想在DTO中序列化某些東西,根本不要添加[DataMember]屬性。然後我看到了其他屬性並做了一些挖掘,似乎明確指出該屬性不會被序列化。

現在我的問題是,哪個更好?添加[IgnoreDataMember]或者不添加任何內容。

我問了一遍,似乎[IgnoreDataMember]是從一切都被序列化的時代,你必須指定什麼應該忽略(我相信.Net 2)。然後他們將其改變爲相反的,你必須明確說明應該序列化什麼。現在看來你可以做到這一點。

回答

37

我問了一遍,看起來[IgnoreDataMember]是從一切都被序列化的日子,你必須指定什麼應該忽略(我相信.Net 2)。然後他們將其改變爲相反的,你必須明確說明應該序列化什麼。

其實這不是真的; IIRC它一直以來是:

  • ,如果它被標記爲[DataContract],那麼只有會員標誌着[DataMember]被認爲是
  • 如果標記爲[DataContract],那麼它默認的一切,但你可以成員使用[IgnoreDataMember]

我通常只是忽略的東西,我不想序列化的[DataMember],但在許多方面[IgnoreDataMember]更明確 - 主要是爲了維護者的利益。它說「我故意沒有序列化這個」,而不是「也許我知道這不是序列化的,但也許我只是忘了添加屬性」。

兩者都可以工作。根據MS:

+3

還有:「IgnoreDataMemberAttribute屬性僅在與未標記類型一起使用時纔有效。如果在同一個類上使用'[DataContract]'和'[IgnoreDataMember]',後者將被忽略。 –

+2

@MichaelEdenfield是迂腐的,'DataContractSerializer'默認爲*所有公共字段和屬性*(公共字段非常罕見);甚至有點含糊不清。例如,如果我們談論的是'NetDataContractSerializer',那麼它默認爲*所有字段*(公共和私人),但沒有屬性 –

+1

我知道這是一箇舊線程,但昨天我遇到了一個問題,表明Edenfield先生說並不完全如此。 我有一個領域,4個屬性的類。所有4個屬性都轉換某種形式的數據(例如字節數組,字符串或其他形式)並將其寫入一個字段。我用DataContract屬性標記了該類,並只將該字段標記爲DataMember。但是,這樣解串器不會忽略這些屬性,而是將它們設置爲默認值(這會覆蓋該字段)。將[IgnoreDataMember]添加到解決問題的屬性中。所以它不會被忽略 –