2013-11-14 84 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]添加到解决问题的属性中。所以它不会被忽略 –