代码之家  ›  专栏  ›  技术社区  ›  aleemb

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

  •  9
  • aleemb  · 技术社区  · 16 年前

    DataContractSerializer 要求类和成员用标记 DataContract DataMember 属性。但是,在我的例子中,类是用efpocooadapper框架自动生成的,这些属性不存在。

    如果不存在这些属性,如何使用DataContractSerializer强制序列化所有成员?

    来自Alexdej:

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

    3 回复  |  直到 16 年前
        1
  •  6
  •   marc_s MisterSmith    16 年前

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

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

    当然,这是:

    • 不允许序列化某个私有对象-如果要序列化该对象,则必须将其公开为公共读/写属性。
    • 不允许您指定已定义的所选参数顺序-它将仅按它们在类中的显示顺序使用它们
    • 现在需要在类中再次使用无参数构造函数进行反序列化

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

    马克

        2
  •  0
  •   Jon Mitchell    16 年前

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

    它比添加属性要稍微多一些,但它确实有效。

        3
  •  0
  •   ahzz    16 年前

    只需用[serializable]属性标记类。 任何不希望使用[非序列化]进行序列化标记的成员。请注意,[serializable]导致默认情况下所有字段都被序列化,其中[datacontract]默认情况下不序列化任何字段,但标记为[datamember]的字段除外。

    推荐文章