9

DataContractSerializer要求类和成员用DataContractDataMember属性标记。但是,就我而言,这些类是使用EFPocoAdapater框架自动生成的,并且这些属性不存在。DataContractSerializer:如何在没有DataContract/DataMember属性的情况下序列化类/成员

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

从Alexdej:

这3.5SP1改变,希望大家看到 说: http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx

回答

6

你不能 - 简单明了。 DataContractSerializer需要该属性来获取要序列化的元素。与XmlSerializer相比,它基本上只是序列化所有的东西(除非你明确地告诉它忽略它),DataContractSerializer是“选入”的 - 你必须明确地告诉它(通过属性)哪些字段和/或属性序列化。正如几位人士指出的那样,在.NET 3.5 SP1中,Microsoft放宽了这些规则 - 任何公共读/写属性都将由DataContractSerializer自动序列化。与此同时,你的类也需要有一个参数的默认构造函数 - 听起来像我们不得不对XmlSerializer的方式回来时的精确要求....

当然,这样的:

  • 不允许你序列化一些私有的东西 - 如果你想序列化它,你必须公开它作为公共读/写属性
  • 不允许你指定一个定义的选择的参数排序 - 它只会在为了让它们出现在类中
  • 现在要求您在类中再次使用无参数构造函数fo r反序列化

我仍然认为这些东西应该是明确和清晰的,这使得不再需要的开辟了懒惰/马虎编程的道路 - 我不喜欢它。但是,如果你愿意,你现在可以使用它,而[DataMember]标注明确标识您的属性.....

马克

+0

我真的很希望你会错,但经过​​大量的谷歌搜索,我担心你是对的。无法使用XmlSerializer(与实体框架一起使用的循环引用问题)。嗯,匿名的课程是。 – aleemb 2009-04-24 18:54:28

0

我相信这是可能的。如果你实现了ISerializable接口,那么序列化程序将使用你的实现而不是属性。尽管我认为你仍然需要标记类[Serializable]。

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

0

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

相关问题