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

3

你好,

我有一个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是从外部webservice接收的。


你想应用什么样的转换?你考虑过使用XSLT(与XmlReader或XPathDocument结合使用)吗? - Dirk Vollmar
它在哪一行代码上花费了更多的时间?在创建序列化器还是在反序列化本身上? - Massimiliano
3个回答

3
XmlSerializer使用反射技术,因此如果性能是一个问题,它并不是最佳选择。您可以使用XmlDocument或XDocument类构建XML文档的DOM并使用它,或者更快地使用XmlReader。但是,如果需要,XmlReader需要自己编写任何对象映射。最佳方法取决于您要对XML数据执行什么操作。您只需要提取某些值还是必须处理和编辑整个文档对象模型?

2
是的,它确实使用了反射,但性能是一个灰色地带。当处理一个8mb的文件时...速度会慢得多。但如果处理小文件,就不会很慢。
我不认为通过XmlReader或XPath读取文件会更容易或更快。还有什么比告诉某个东西将你的xml转换为对象或将你的对象转换为XML更容易的呢?没有太多。
现在,如果您需要精细控制,那么也许需要手动处理。
就我个人而言,选择就像这样。我愿意牺牲一点速度来保存一堆丑陋的代码。
就像软件开发中的其他所有事情一样,存在权衡。

1
你可以尝试在你的"T"类中实现IXmlSerializable接口,并编写自定义逻辑来处理XML。

听起来很有趣,你能给我提供高性能序列化选项的指引吗? - edosoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接