【问题标题】:What is the most efficient way to Deserialze an XML file反序列化 XML 文件的最有效方法是什么
【发布时间】:2023-04-01 03:23:01
【问题描述】:

阿罗哈,

我有一个想要反序列化的 8MB XML 文件。 我正在使用此代码:

public static T Deserialize<T>(string xml)
{
    TextReader reader = new StringReader(xml);
    Type type = typeof(T);
    XmlSerializer serializer = new XmlSerializer(type);
    T obj = (T)serializer.Deserialize(reader);
    return obj; 
}

这段代码运行大约需要一分钟,这对我来说似乎相当慢。我尝试使用 sgen.exe 来预编译序列化 dll,但这并没有改变性能。

我还有哪些其他选择可以提高性能?

[编辑] 我需要反序列化创建的对象来执行(基本)转换。 XML 是从外部网络服务接收的。

【问题讨论】:

  • 您要应用什么样的转换?您是否考虑过使用 XSLT(与 XmlReader 或 XPathDocument 结合使用)?
  • 在哪一行代码中花费的时间更多?创建序列化程序还是反序列化本身?

标签: c# performance xml-serialization sgen


【解决方案1】:

XmlSerializer 使用反射,因此如果存在性能问题,它不是最佳选择。

您可以使用 XmlDocumentXDocument 类构建 XML 文档的 DOM 并使用它,或者更快地使用 XmlReader。但是,XmlReader 要求您自己编写任何对象映射(如果需要)。

哪种方法最好取决于您想对 XML 数据做什么。您只是需要提取某些值还是必须工作和编辑整个文档对象模型?

【讨论】:

    【解决方案2】:

    是的,它确实使用反射,但性能是一个灰色区域。当谈论一个 8mb 的文件时......是的,它会慢得多。但是如果处理一个小文件就不会了。

    我不会说读取文件小瓶 XmlReader 或 XPath 会更容易或真的更快。有什么比告诉某些东西将您的 xml 转换为对象或将您的对象转换为 XML 更容易...?不多。

    现在,如果您需要细粒度控制,那么也许您需要手动完成。

    个人选择是这样的。我愿意放弃一点速度来节省大量丑陋的代码。

    就像软件开发中的其他所有事情一样,也需要权衡取舍。

    【讨论】:

      【解决方案3】:

      您可以尝试在“T”类中实现 IXmlSerializable,编写自定义逻辑来处理 XML。

      【讨论】:

      • 听起来很有趣,你能给我提供一些高性能序列化选项的指针吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多