21

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

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

我无法得出我应该遵循的实施方法。我可以想到以下实现方法:

  1. LINQ to XML - 这看起来不错,但我需要为每种类型的对象手动创建 XML 树(即类实例的元素或 XML 表示)。由于实体类很多,而且它们相互关联,我认为手动编写 XML 元素的工作量太大。此外,当实体类引入一些新属性时,我将不得不继续修改 XML 树。不仅如此,我生成 XML 树的代码看起来有点笨拙(至少在外观上),并且将来更难由其他开发人员维护/更改;他/她必须仔细查看它才能了解 XML 是如何生成的。

  2. XmlSerializer - 我可以编写自己的实体类来表示我想要的 XML 结构。现在,我需要将传入对象的详细信息复制到我自己的类的对象中。所以这是额外的工作(当代码执行时也适用于.NET!)。然后我可以XmlSerializer在我的对象上使用来生成 XML。在这种情况下,我必须创建实体类,并且每当第三方实体被修改时,我只需要在我的类中添加新属性。(使用 XmlElement 或 XmlAttibute 属性)。但是人们推荐DataContractSerializer这个,所以我不想最终确定这个,除非我对所有方面都很清楚。

  3. DataContractSerializer - 同样在这里,我必须编写自己的实体类,因为我无法控制第三方 DataContracts。我需要将传入对象的详细信息复制到我自己的类的对象中。所以这是额外的工作。但是,由于 DataContractSerializer 不支持 Xml 属性,我必须IXmlSerializable在方法中实现并生成所需的 Xml WriteXmlDataContractSerializer 比 XmlSerializer 快,但如果第三方实体发生更改,我将不得不再次处理更改(在 WriteXml 中)。

问题:

  • 考虑到性能,在这种情况下哪种方法最好?
  • 你能建议一些更好的方法吗?
  • 当传入的实体类可能发生变化时,是否DataContractSerializer值得考虑(因为它具有更好的性能)?XmlSerilaizer
  • LINQ 真的应该用于序列化吗?或者它对查询以外的事情真的有好处吗?
  • 在这种情况下,XmlSerializer 是否可以优于 LINQ?如果是,为什么?
4

3 回答 3

9

我同意@Werner Strydom 的回答。

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

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

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

LINQ在 1:M 关系的情况下的小用法:

Employee无论我在特定节点(比如)下多次想要相同的元素(比如Department),我都声明了 type 的属性List<T>。例如public List<Employee> EmployeesDepartment课堂上。在这种情况下,XmlSerializer 显然在节点下添加了一个名为Employees(它是所有Employee元素的分组)的元素。Department在这种情况下,我使用LINQ在 XmlSerializer 序列化 .NET 对象之后)来操作XElement由 XmlSerializer 生成的(即 XML)。使用LINQ,我只是将所有Employee节点直接放在节点下Department并删除了Employees节点。

但是,我通过xmlSerializer和的组合获得了预期的性能LINQ

缺点是,我创建的所有类都必须是公开的,而它们很可能是内部的!

为什么不DataContractSerializerLINQ-to-XML

  • DataContractSerializer不允许使用 Xml 属性(除非我实现IXmlSerializable)。请参阅DataContractSerializer 支持的类型
  • LINQ-to-XMLIXmlSerializable同样)在创建复杂的 XML 结构时使代码变得笨拙,并且该代码肯定会让其他开发人员在维护/更改它时摸不着头脑。

还有其他方法吗?

于 2012-07-06T04:34:14.340 回答
7

我会选择 XmlSerializer,因为它对于自定义模式来说是最易于维护的(假设您有 XSD)。完成系统开发后,全面测试其性能并确定 XML 序列化是否导致问题。如果是这样,您可以将其替换为需要更多工作的东西并再次测试以查看是否有任何收益。但是,如果 XML 序列化不是问题,那么您就有了可维护的代码。

与与数据库或外部系统通信相比,解析一小段 XML 数据所花费的时间可以忽略不计。在具有大内存 (16GB+) 的系统上,您可能会发现 GC 是 .NET 4 和更早版本中的瓶颈(.NET 4.5 试图解决这个问题),尤其是当您处理非常大的数据集和流时。

使用AutoMapper将XSD.EXE创建的对象映射到您的实体。这将允许在不影响 Web 服务的情况下更改数据库设计。

LINQ to XML 的一大优点是XSD 验证。但是,这会影响性能。

于 2012-06-22T08:37:58.113 回答
1

另一种选择是利用 LINQ 和 Reflection 创建一个通用类来将您的对象序列化为 XML。一个很好的例子可以在http://primecoder.blogspot.com/2010/09/how-to-serialize-objects-to-xml-using.html找到。我不确定您的 XML 在一天结束时需要是什么样子,但如果它非常基本,这可以解决问题。当您的实体类添加/删除/更改属性时,您不需要进行更改,并且您可以在所有对象(以及其他项目,如果存储在实用程序 DLL 中)使用它。

于 2012-07-03T21:48:50.430 回答