LINQ到XML VS XmlSerializer的VS的DataContractSerialize

2019-07-30 01:58发布

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

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

我不能断定我应该遵循实施办法。 我能想到以下实施途径:

  1. LINQ到XML -这看起来不错,但我需要手动创建XML树(即元素或类实例的XML表示)为每种类型的对象。 由于有许多实体类和它们是相互关联的,我觉得这是工作太多的手动编写XML元素。 此外,我将必须继续修改XML树作为当实体类引入了一些新特性。 不仅如此,在那里我生成XML树看起来有点笨拙(至少在外观)和将更难在将来的某个其他开发人员保持/更改代码; 他/她会看它如此紧密地了解如何生成XML。

  2. XmlSerializer的 -我可以写表示XML结构我想我自己的实体类。 现在,我需要从传入对象复制细节,以我自己的类的对象。 因此,这是额外的工作(对于.NET代码执行时也!)。 然后,我可以使用XmlSerializer我的对象生成XML。 在这种情况下,我必须创建实体类,每当第三方实体被修改,我得只是在我的类中添加新的属性。 (带的XmlElement或XmlAttibute属性)。 但人们推荐DataContractSerializer了这一个,所以我不希望完成此,除非各方面都很清晰。

  3. DataContractSerializer的 -同样在这里,我得写我自己的实体类,因为我有过第三方DataContracts没有控制权。 我需要从传入对象复制细节,以我自己的类的对象。 因此,这是额外的工作。 然而,由于DataContractSerializer的不支持XML属性,我就必须实现IXmlSerializable ,并生成所需的XML WriteXml方法。 DataContractSerializer的比XmlSerializer的速度更快,但同样我会处理,如果第三方实体的变化改变(中WriteXML)。

问题:

  • 哪种方法最好是在这种情况下考虑的性能呢?
  • 您能否提供一些更好的方法吗?
  • DataContractSerializer值得考虑(因为它拥有更好的性能XmlSerilaizer )来电实体类时,可随时更改?
  • 如果LINQ可以真正用于序列化? 或者是比查询其他的东西真的很好吗?
  • XmlSerializer的可优于LINQ在这种情况下? 如果是,为什么?

Answer 1:

我同意@Werner Strydom的答案。

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

这是我如何解决我的问题:

我创建实体类(表示各种类型的XML元素),按照我的要求,并通过XmlSerializer的传递的根类的实例(类表示根元素)。

小使用LINQ中的1例:M的关系:

只要我想相同的元素(比如Employee )在特定节点多次(说Department ),我声明类型的属性List<T> 例如, public List<Employee> EmployeesDepartment级。 在这种情况下的XmlSerializer明显加入称为元件Employees (这是所有分组的Employee的下元件) Department的节点。 在这种情况下,我使用LINQ (XmlSerializer的序列化的.NET对象后 )操纵XElement由XmlSerializer的生成(即,XML)。 使用LINQ ,我干脆把所有Employee节点直属Department节点和删除的Employees节点。

但是,我得到了通过组合的预期性能xmlSerializerLINQ

不足之处是,我创建的所有类必须是公开的时候,他们很可能是内部的!

为什么不DataContractSerializerLINQ-to-XML

  • DataContractSerializer不允许使用XML属性(除非我实现IXmlSerializable )。 请参阅通过DataContractSerializer的支持的类型 。
  • LINQ-to-XML (和IXmlSerializable太),并创建复杂的XML结构使得代码笨拙的代码肯定会令其他开发商摸不着头脑,同时保持/改变它。

有没有其他办法?

  • 是。 正如@Werner Strydom提到的,你可以很好地产生使用类XSD.exe或工具,如Xsd2Code ,如果你很高兴与得到的类直接与他们合作。


Answer 2:

我来接XmlSerializer的,因为它是最易于维护的自定义模式(假设你有XSD)。 当您完成开发系统,测试其性能的全部,并确定XML序列化是否导致问题。 如果是,你就可以用的东西,需要更多的工作,并再次测试,看看是否有任何收获更换。 但是,如果XML序列化是不是一个问题,那么你就必须维护的代码。

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

使用AutoMapper映射通过创建的对象XSD.EXE到您的实体。 这将允许数据库设计变更不影响网络服务。

有一两件事,是了不起的LINQ to XML是XSD验证 。 然而,这会影响性能。



Answer 3:

另一种选择是利用LINQ和反射创建一个泛型类的序列化对象到XML。 这方面的一个很好的例子,可以发现http://primecoder.blogspot.com/2010/09/how-to-serialize-objects-to-xml-using.html 。 我不知道你的XML需要的东西看起来像在这一天结束,但如果它是非常基本的,这可能做的伎俩。 你不必为你的实体类添加/删除/更改属性进行修改,并且(如果存储在公用DLL等项目),你可以使用这个在您的所有对象。



文章来源: Linq to Xml VS XmlSerializer VS DataContractSerializer