没有[DataMember]属性与具有[IgnoreDataMember]属性

Dav*_*ton 28 c# wcf

所以我一直在经历着我们的代码库,我已经看到了一些我们的DTO的有一个混搭[DataMember][IgnoreDataMember]属性.

在过去,我们被告知如果我们不想在DTO中序列化某些内容,只需添加[DataMember]属性即可.然后我看到了另一个属性并进行了一些挖掘,似乎这明确表明该属性不会被序列化.

现在我的问题是,哪个更好?添加 [IgnoreDataMember]或不添加任何内容.

我已经四处询问,似乎[IgnoreDataMember]是从所有序列化的日子开始,你必须决定应该忽略什么(我相信.Net 2).然后他们将其更改为反向,您必须明确说明应该序列化的内容.现在看来你可以做到这两点.

Mar*_*ell 53

我已经四处询问,似乎[IgnoreDataMember]来自所有序列化的日子,你必须决定应该忽略什么(我相信.Net 2).然后他们将其更改为反向,您必须明确说明应该序列化的内容.

实际上这并不完全正确; IIRC一直都是:

  • 如果标记为 [DataContract],则仅[DataMember]考虑标记的成员
  • 如果它没有标记为[DataContract],则默认为所有内容,但您可以使用减去成员[IgnoreDataMember]

我通常只是省略了[DataMember]我不想序列化的东西,但在很多方面[IgnoreDataMember]更明确 - 主要是为了维护者的利益.它说"我故意没有序列化这个",而不是"也许我知道这不是序列化的,但也许我只是忘了添加属性".

要么工作.

  • 另据MS称:"IgnoreDataMemberAttribute属性仅在与未标记类型一起使用时才受到尊重."; 如果在同一个类上使用`[DataContract]`和`[IgnoreDataMember]`,则忽略后者. (3认同)
  • 我知道这是一个老话题,但昨天我遇到了一个问题,表明伊登菲尔德先生所说的并非如此.我有一个有一个字段的类,有4个属性.所有4个属性都转换某种形式的数据(例如字节数组,字符串或其他形式)并将其写入一个字段.我使用DataContract属性标记了类,并仅将该字段标记为DataMember.但是,这样反序列化器不会忽略属性,而是将它们设置为默认值(将覆盖该字段).将[IgnoreDataMember]添加到属性修复了问题.所以它不会被忽视 (3认同)
  • @MichaelEdenfield迂腐,`DataContractSerializer`默认为*所有公共字段和属性*(公共字段非常罕见); 甚至那有点暧昧.例如,如果我们讨论的是`NetDataContractSerializer`,那么它默认为*所有字段*(公共和私有),但没有属性 (2认同)