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

datacontractserializer efpocoadapter entity-framework serialization

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

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

来自Alexdej:

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

一般承认的答案

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

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

当然,这个:

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

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


热门答案

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




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因