【问题标题】:How can I ignore a property when serializing using the DataContractSerializer?使用 DataContractSerializer 进行序列化时如何忽略属性?
【发布时间】:2010-12-20 00:02:12
【问题描述】:

我正在使用 .NET 3.5SP1 和 DataContractSerializer 来序列化一个类。在 SP1 中,他们更改了行为,因此您不必在类中包含 DataContract/DataMember 属性,它只会序列化整个事物。这是我正在使用的行为,但现在我需要忽略序列化程序中的一个属性。我知道这样做的一种方法是将DataContract 属性添加到类中,然后将DataMember 属性放在我想要包含的所有成员上。不过,我有理由认为这对我不起作用。

所以我的问题是,是否有一个属性或什么可以让DataContractSerializer 忽略一个属性?

【问题讨论】:

    标签: c# .net wcf serialization


    【解决方案1】:

    您可能正在寻找IgnoreDataMemberAttribute

    【讨论】:

    • 我的域层没有正确的程序集引用,然后我错过了阅读文档并最终认为这是 .NET 4.5 的新功能。试图找回这个线程以删除我的评论但没有成功(很着急)。此外,看看这个答案的日期应该已经敲响了...... 2009 .NET 4.5 帖子......)抱歉浪费你的时间。
    • 在 .NET 4.5 上:System.Runtime.Serialization.IgnoreDataMemberAttribute 适用于任何事情
    • 即使是第 3 方库也增加了对 [IgnoreDataMember] 的支持,例如 JSON.NET。
    • 一个简短的例子难道不会让这个答案真正值得投票吗?
    • 这个答案不完整,因此具有误导性。如果类具有[Serializable] 属性,[IgnoreDataMember] 将不起作用。请参阅Doug 的答案中的详细信息。
    【解决方案2】:

    此外,DataContractSerializer 将序列化标记为 [Serializable] 的项目,还将序列化 .NET 3.5 SP1 及更高版本中未标记的类型,以支持序列化匿名类型。

    因此,如何防止成员序列化取决于您如何装饰您的类:

    • 如果您使用了[DataContract],请删除该属性的[DataMember]
    • 如果您使用了[Serializable],则在属性的字段前面添加[NonSerialized]
    • 如果你还没有装饰你的班级,那么你应该在属性中添加[IgnoreDataMember]

    【讨论】:

    • “装饰你的班级”是什么意思,请解释一下?
    • 如果您没有在您的类中使用任何属性,例如 [DataContract] 或 [Serializable],那么您可以将 [IgnoreDataMember] 添加到您不想序列化的属性中。请参阅 Paul 的回答或 checkoutall.com/Blog/Index/201410240204236271/…
    • 这比接受的答案提供的信息要多得多。
    • 有什么办法可以忽略该成员并继续序列化数据结构/类?
    • 在使用 [Serializable] 时排除一个 PROPERTY 怎么样?
    【解决方案3】:

    在 XML 序列化中,您可以使用 [XmlIgnore] 属性 (System.Xml.Serialization.XmlIgnoreAttribute) 在序列化类时忽略属性。

    这可能对你有用(或者它可能对任何发现这个问题的人有用,当我试图找出在 XML 中序列化时如何忽略属性时,就像我一样)。

    【讨论】:

    • 啊反对票。只是想我会发布它,因为当我搜索如何在序列化类时忽略属性时,出现了这篇文章。如果有人和我一样发现这篇文章,我想把它放在这里。
    • [in meta] 我认为他们投了反对票,因为你应该打开另一个(更具体的)关于 XMLSerialization 的问题并回答它,这样人们会发现这个问题在他们的搜索中更相关
    • 这个答案正是我想要的
    【解决方案4】:

    尝试使用 [NonSerialized()] 属性标记字段。这将告诉序列化程序忽略该字段。

    https://msdn.microsoft.com/en-us/library/system.nonserializedattribute(v=vs.110).aspx

    【讨论】:

    • 在使用 DataContractSerializer 时不会
    • 他问的是属性而不是字段!
    【解决方案5】:

    你所说的与它在这个位置的 MSDN 库中所说的有冲突:

    http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx

    我没有看到您提到的 SP1 功能。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多