【问题标题】:XmlSerializer.Deserialize() is too slow with files over 1MB - .Net compact framework 3.5 sp1XmlSerializer.Deserialize() 对于超过 1MB 的文件来说太慢了 - .Net compact framework 3.5 sp1
【发布时间】:2011-01-25 21:03:40
【问题描述】:

我得到了一个 XML 架构,我使用 xsd.exe 为其生成了一个类 FooClass

我正在接收来自主机的 xml 请求,我从目录中获取它们并使用 XmlSerializer.Deserialize() 获取我的 FooClass 的实例。

嗯,这工作到现在很完美,现在仍然有效,但突然间我开始得到更大的 XML 文件(大约 300KB),而 Deserialize() 所花费的时间是不可接受的!用XMLTextReader() 加载同一个XML 文件需要几毫秒,反序列化的时间大约是1 分30 秒!

所以我想我会使用 XMLReader 来读取 XML 文件并自己构建FooClass! 但是在我开始重新编写所有代码之前,我想问一下是否有一种方法可以更快地使用XmlSerializer.Deserialize()

我不确定 XMLSerializer 程序集是否对我有很大帮助?

这是我的代码,将在每个文件的循环中调用

using (MemoryStream ms = new MemoryStream(xmldata)
{
   XmlSerializer sz = new XmlSerializer(typeof(FooClass));
   foo = (FooClass)sz.Deserialize(ms);
} 

提前致谢, AK

【问题讨论】:

  • 你确定是 XML 而不是模式解析器超时?
  • 感谢您的提示,但我确定!因为没有定义外部模式/命名空间!像 100 KB 这样的小 XML 文件可以被反序列化快到足以闭上眼睛 LOL。因此,如果解决将是一个问题,则必须适用于所有大小的 XML 文件!我猜!

标签: .net xml serialization xmlserializer


【解决方案1】:

您是否尝试过 .NET 3.5 中的新 DataContractSerializer?你使用它的方式和XmlSerializer差不多;我不知道它是否更快,但它比XmlSerializer 有许多其他好处,例如序列化私有成员,不需要无参数构造函数,能够忽略属性等。

using (MemoryStream ms = new MemoryStream(xmldata))
{
    DataContractSerializer s = new DataContractSerializer(typeof(FooClass));
    FooClass c = s.ReadObject(ms) as FooClass;
}

您需要将[DataContract] 属性添加到FooClass 的定义中,您不必这样做,但我通过用[DataMember] 装饰它们来明确告诉序列化程序我想要序列化哪些成员。

[DataContract]
public class FooClass
{
    public string IgnoreThisProperty { get; set; }

    [DataMember]
    public string SerialiseThisProperty { get; set; }
}

【讨论】:

  • 非常感谢您的回复。我还没有使用 DataContractSerializer,但是如果我没有找到任何其他方法,我会尝试它! ;-) 问题是重新设计/装饰 FooClass!有没有像 xsd.exe 这样的工具会生成一个支持 DataContractSerializer 的类?
  • 如果您需要符合特定的 XML 模式,DataContractSerializer 不会真正帮助您,因为它使您对文档结构的控制更少
  • 非常感谢您提供的信息!
  • @Thomas - 我同意 DataContractSerializer 不允许对 XML 进行太多控制,但在之前的评论中,它看起来海报并未使用任何模式,因此可能就足够了。 @Gohlool,无需重新设计您的类,只需将 [DataContract] 放在类定义上方,并将 [DataMember] 放在您想要(反)序列化的每个属性上方。将类从 XmlSerializer 转换为 DataContractSerializer 需要几秒钟,具体取决于其复杂性以及与其他类的关系。
  • 谢谢安迪!我会试试的。干杯
猜你喜欢
  • 2020-08-08
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
相关资源
最近更新 更多