使用DataContractSerializer进行序列化时,如何忽略属性?


125

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

所以我的问题是,是否存在一个属性或可以用来使DataContractSerializer忽略属性的东西?

Answers:


176

5
我的域层没有正确的程序集引用,因此我错读了文档,最终认为它是.NET 4.5的新功能。试图找回该线程以删除我的评论而没有成功(很忙)。此外,看着这个答案的日期应该已经响起了。...2009 .NET 4.5发布...)很抱歉浪费您的时间。
Pluc

2
在.NET 4.5上,此处:System.Runtime.Serialization.IgnoreDataMemberAttribute适用于任何事物
SparK 2013年

1
甚至第三方库也添加了对[IgnoreDataMember]的支持,例如JSON.NET。
道格2015年

5
一个简短的例子难道不是一个真正值得投票的答案吗?
TaW

1
这个答案是不完整的,因此具有误导性。[IgnoreDataMember]如果类具有[Serializable]属性,则将不起作用。请参阅Doug的答案中的详细信息。
Alex Fainshtein

165

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

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

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

1
请问“装饰班级”是什么意思?
阿拉明2015年

如果您没有在类中使用任何属性,例如[DataContract]或[Serializable],则可以将[IgnoreDataMember]添加到您不想序列化的属性中。见保罗的回答或checkoutall.com/Blog/Index/201410240204236271/...
道格

8
这比公认的答案要有用得多。
pvgoran

有什么方法可以忽略该成员并继续序列化数据结构/类吗?
ryanwebjackson

使用[Serializable]时排除PROPERTY怎么样?
丹尼尔(Daniel)

31

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

这可能对您有用(或者对在我像在XML中进行序列化时试图找出如何忽略属性的任何发现此问题的人一样有用)。


4
否定投票啊。只是以为我会发布该帖子,因为当我在序列化一个类时搜索如何忽略属性时,出现了该帖子。如果有人以与我相同的方式找到了这篇文章,我想把它放在这里。
克里斯·亚当斯

[in meta]我认为他们投了反对票,因为您应该打开另一个有关XMLSerialization的问题(更具体),然后回答它,所以人们会发现该问题与他们的搜索更为相关
SparK 2013年

8
这个答案正是我在寻找的答案
aclave1 2014年


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.