DataContractSerializer:如何序列化没有DataContract / DataMember属性的类/成员

时间:2009-04-24 04:51:01

标签: entity-framework serialization datacontractserializer efpocoadapter

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

如果没有这些属性,我如何强制使用DataContractSerializer对所有成员进行序列化?

  

来自Alexdej:

     

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

3 个答案:

答案 0 :(得分:6)

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

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

当然,这是:

  • 不允许您序列化私有内容 - 如果要序列化它,则必须将其公开为公共读/写属性
  • 不允许您指定参数的已定义选择顺序 - 它将按照它们在类中出现的顺序使用它们
  • 现在要求您再次在类中使用无参数构造函数进行反序列化

我仍然认为这些事情应该明确而清晰,不再需要那些开辟了懒惰/草率编程的道路 - 我不喜欢它。但是如果你愿意,你现在可以使用它,而无需用[DataMember] .....

明确标记你的属性

马克

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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