10

DataContractSerializer需要用DataContractDataMember属性标记类和成员。但是,在我的情况下,这些类是使用 EFPocoAdapater 框架自动生成的,并且这些属性不存在。

在不存在这些属性的情况下,如何使用 DataContractSerializer 强制对所有成员进行序列化?

来自亚历克斯德:

这在 3.5SP1 中发生了变化,希望您看到: http ://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx

4

3 回答 3

7

你不能——简单明了。DataContractSerializer 需要该属性来获取要序列化的元素。与基本上只是序列化所有内容的 XmlSerializer 不同(除非您明确告诉它忽略它),DataContractSerializer 是“选择加入”的 - 您必须明确告诉它(通过属性)哪些字段和/或属性序列化。

更新:正如一些人指出的那样,在 .NET 3.5 SP1 中,微软稍微放宽了这些规则——任何公共读/写属性都将由 DataContractSerializer 自动序列化。同时,你的类还需要有一个无参数的默认构造函数——听起来就像我们对 XmlSerializer 的确切要求......

当然,这个:

  • 不允许你序列化一些私有的东西——如果你想序列化它,你必须将它公开为公共读/写属性
  • 不允许您指定已定义的参数选择顺序 - 它只会按照它们在类中出现的顺序使用它们
  • 现在要求您在类中再次具有无参数构造函数以进行反序列化

我仍然认为这些东西应该是明确和清晰的,让那些不再需要的东西为懒惰/草率的编程开辟了道路——我不喜欢它。但是,如果您愿意,您现在可以使用它,而无需使用 [DataMember] 显式标记您的属性.....

马克

于 2009-04-24T05:20:26.063 回答
0

我相信这是可能的。如果您实现 ISerializable 接口,则序列化程序使用您的实现而不是属性。尽管我认为您仍然必须标记类 [Serializable]。

它比添加属性多一点工作,但它确实有效。

于 2009-04-30T19:10:15.380 回答
0

只需使用 [Serializable] 属性标记类。任何您不想用 [NonSerialized] 序列化标记的成员。请注意,[Serializable] 默认情况下会导致所有字段都被序列化,其中 [DataContract] 默认情况下不序列化任何字段,除了标记为 [DataMember] 的字段。

于 2009-11-24T21:43:20.660 回答