在我的web method中,我得到了一些第三方C#实体类的对象。实体类不过是DataContract。这个实体类非常复杂,具有各种类型的属性,某些属性也是集合。当然,那些链接类型也是DataContracts。

作为Web服务的业务逻辑的一部分,我想将该DataContract实体序列化为XML 我不能直接使用DataContractSerializer(在Web方法中接收到的对象上)仅因为XML模式完全不同。 因此,不会针对该架构验证DataContractSerializer生成的XML。

我无法总结实现方法。我可以想到以下实现方法:

  • LINQ to XML -看起来不错,但是我需要为每种类型的对象手动创建XML树(即类实例的元素或XML表示形式)。由于存在许多实体类,并且它们彼此链接,所以我认为手动编写XML元素需要大量工作。此外,当实体类引入一些新属性时,我将不得不继续修改XML树。 不仅如此,我生成XML树的代码看起来也不那么笨拙(至少在外观上),并且将来某些其他开发人员将难以维护/更改。他/她将必须仔细研究它以了解XML的生成方式。
  • XmlSerializer -我可以编写代表自己想要的XML结构的自己的实体类。现在,我需要将详细信息从传入对象复制到我自己的类的对象中。 因此,这是额外的工作(代码执行时也适用于.NET!)。 然后,我可以在对象上使用XmlSerializer生成XML。在这种情况下,我将必须创建实体类,并且每当修改第三方实体时,都必须在类中添加新属性。 (具有XmlElement或XmlAttibute属性)。 但人们建议在此代码上使用DataContractSerializer,因此除非所有方面对我都清楚,否则我不希望最终确定该代码。
  • DataContractSerializer -在这里,由于我无法控制第三方DataContracts,因此我必须编写自己的实体类。而且我需要将详细信息从传入对象复制到我自己的类的对象中。所以这是额外的工作。但是,由于DataContractSerializer不支持Xml属性,因此我必须实现IXmlSerializable并在WriteXml方法中生成所需的Xml。 DataContractSerializer比XmlSerializer快,但是如果第三方实体发生更改,我将不得不再次处理更改(在WriteXml中)。

  • 问题:
  • 在这种情况下,考虑到性能,哪种方法最好?
  • 您可以建议一些更好的方法吗?
  • 当传入实体类可能发生更改时,是否值得考虑DataContractSerializer(因为它比XmlSerilaizer具有更好的性能)?
  • LINQ是否应该真正用于序列化?还是对查询以外的其他东西真的好?
  • 在这种情况下,可以使用XmlSerializer而不是LINQ吗?如果是,为什么?
  • 最佳答案

    我同意@Werner Strydom的回答。

    我决定使用XmlSerializer ,因为代码变得可维护并且提供了我期望的性能。最重要的是,它使我可以完全控制XML结构。

    这就是我解决问题的方式:

    我根据需要创建了实体类(代表各种类型的Xml元素),并通过XmlSerializer传递了根类的实例(代表根元素的类)。

    在1:M关系中少量使用LINQ:

    在特定节点(例如Employee)下多次需要同一个元素(例如Department)的地方,我都声明了List<T>类型的属性。例如public List<Employee> Employees类中的Department。在这种情况下,XmlSerializer显然在Employees节点下添加了一个称为Employee的元素(它是所有Department元素的分组)。在这种情况下,我使用LINQ(在XmlSerializer序列化.NET对象之后)来操纵XmlSerializer生成的XElement(即XML)。使用LINQ,我只需将所有Employee节点直接放在Department节点下,然后删除Employees节点。

    但是,结合使用xmlSerializerLINQ可以获得预期的性能。

    缺点是,当我创建的所有类很可能是内部的时,它们都必须是公共(public)的!

    为什么不使用DataContractSerializerLINQ-to-XML

  • DataContractSerializer不允许使用Xml属性(除非我实现IXmlSerializable)。参见types supported by DataContractSerializer
  • LINQ-to-XML(还有IXmlSerializable)在创建复杂的XML结构时会使代码变得笨拙,并且该代码肯定会使其他开发人员在维护/更改它时费尽心思。

  • 还有其他方法吗?
  • 是的。如@Werner Strydom所述,您可以使用XSD.exe或诸如Xsd2Code之类的工具很好地生成类,如果对生成的类满意,可以直接与它们一起工作。
  • 关于serialization - Linq到Xml VS XmlSerializer VS DataContractSerializer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11151231/

    10-12 06:01