serialization - Linq to Xml VS XmlSerializer VS DataContractSerializer

标签 serialization .net-4.0 xml-serialization linq-to-xml datacontractserializer

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

我想将该 DataContract 实体序列化为 XML 作为我的 Web 服务的业务逻辑的一部分。 我不能使用 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 传递了根类的实例(代表根元素的类)。

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

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

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

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

    为什么不 DataContractSerializerLINQ-to-XML ?

  • DataContractSerializer不允许使用 Xml 属性(除非我实现 IXmlSerializable )。见types supported by DataContractSerializer .
  • LINQ-to-XML (和 IXmlSerializable 也是)在创建复杂的 XML 结构时使代码变得笨拙,并且这些代码肯定会让其他开发人员在维护/更改它时摸不着头脑。

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

    相关文章:

    c# - Azure服务总线: Creating a BrokeredMessage from Object

    java - 为什么不使用 google.gson.GsonBuilder JSON 解析器序列化静态字段?

    c# - 有没有办法用 ToolboxBitmap 实现真正的透明度?

    c# - 列出 <class> 按字母顺序排列,同时将某些项目保持在顶部?

    c# - 此 XmlWriter 不支持 base64 编码数据

    c# - 我应该在哪里保存序列化数据文件?

    c# - 减少数据库往返

    c++ - 无法构建简单的 Boost XML 序列化示例

    xml - 在 jaxb 编码中动态设置对象的命名空间

    java - Android:保存/加载 gson.JsonObjects 的 ArrayList?