什么是反序列化XML文件的最有效方法

时间:2009-02-04 13:22:49

标签: c# performance xml-serialization sgen

阿罗哈,

我有一个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,但这并没有改变性能。

我还有哪些其他方法可以改善表现?

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

我不会说读取文件样式瓶XmlReader或XPath会更容易或更快。然后告诉某些东西将你的xml变成一个对象或你的对象变成XML会更容易吗?不多了。

现在,如果你需要细粒度控制,那么你可能需要手工完成。

个人选择是这样的。我愿意放弃一点速度来保存一大堆令人讨厌的代码。

与软件开发中的其他所有内容一样,存在折衷方案。

答案 2 :(得分:1)

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