【问题标题】:Not having a [DataMember] attribute vs having the [IgnoreDataMember] attribute没有 [DataMember] 属性与具有 [IgnoreDataMember] 属性
【发布时间】:2013-11-14 11:17:29
【问题描述】:

所以我一直在浏览我们的代码库,我发现我们的一些 DTO 混合了 [DataMember] 和 [IgnoreDataMember] 属性。

过去,我们被告知如果我们不希望 DTO 中的某些内容被序列化,只需不要添加 [DataMember] 属性。然后我看到了另一个属性并做了一些挖掘,似乎这明确说明该属性不会被序列化。

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

我四处询问,似乎[IgnoreDataMember] 是从所有内容都被序列化的日子开始的,您必须指定应该忽略的内容(我相信.Net 2)。然后他们将其更改为相反的内容,您必须明确说明应该序列化的内容。现在看来你可以两者兼得。

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    我四处询问,似乎 [IgnoreDataMember] 是从一切都被序列化的日子开始的,你必须规定应该忽略什么(我相信 .Net 2)。然后他们将其更改为相反的内容,您必须明确说明应该序列化的内容。

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

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

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

    两者都行。

    【讨论】:

    • 另外,根据 MS:“IgnoreDataMemberAttribute 属性仅在与未标记的类型一起使用时才有效。”;如果你在同一个类上使用[DataContract] 和[IgnoreDataMember],后者会被忽略。
    • @MichaelEdenfield 是迂腐的,DataContractSerializer 默认为所有公共字段和属性(公共字段非常少见);甚至这有点模棱两可。例如,如果我们谈论的是NetDataContractSerializer,那么它默认为所有字段(公共和私有),但没有属性
    • 我知道这是一个旧线程,但我昨天遇到了一个问题,表明 Edenfield 先生所说的并非完全如此。我有一个包含一个字段和 4 个属性的类。所有 4 个属性都转换某种形式的数据(例如字节数组、字符串或其他)并将其写入一个字段。我用 DataContract 属性标记了该类,并且仅将该字段标记为 DataMember。但是,这种方式反序列化器不会忽略属性,而是将它们设置为默认值(这将覆盖该字段)。将 [IgnoreDataMember] 添加到属性中修复了该问题。所以它不会被忽视
    • 使用 [DataContract] 和 [DataMember] 的一个优点是变量/属性名称的解耦。在我的情况下,我有一个 Java 后端,其中约定是以小写字母开头的变量,这与 C# 中的约定相矛盾,公共变量/属性以大写字符开头。
    猜你喜欢
    • 1970-01-01
    • 2010-10-08
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多