XDocument的XML反序列化太慢

本文关键字:反序列化 XML XDocument | 更新日期: 2023-09-27 18:23:35

我有一个非常奇怪的问题。我有一个SQL Server数据库,它返回大量的XML。在中间,我有.Net C#代码。在前面,我有两个项目,一个是WCF,另一个是Console应用程序(仅用于测试)。

现在,当我运行代码从DB获取XML并使用控制台应用程序对其进行反序列化时,它运行得非常快。但是,当我通过WCF运行相同的代码时,反序列化XML需要很长时间。我确信,DB不是这里的瓶颈,但序列化程序是。

我正在使用XmlSerializer。我无法切换到DataContractSerializer,因为我有很多XML属性要处理。

编辑:

这是静态类中的序列化代码:

public static T DeSerialize(String xml)
{
    T dto = default(T);
    try
    {
        XDocument parsedXML = XDocument.Parse(xml);
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute);
        serializer.UnknownElement += new XmlElementEventHandler(serializer_UnknownElement);
        serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode);
        serializer.UnreferencedObject += new UnreferencedObjectEventHandler(serializer_UnreferencedObject);
        if (serializer.CanDeserialize(parsedXML.CreateReader()))
        {
                    **--This is where everything gets stuck--**
            dto = (T)serializer.Deserialize(parsedXML.CreateReader());
        }
    }
    catch (Exception ex)
    {
        throw;
    }
    return dto;
}

然后我有一个经理,比方说WorkManager,它使用这个代码:

Work work = Serialize<Work>.DeSerialize(xml); 

并且上面的语句是从控制台应用程序和WCF项目中调用的。

接口为:

[OperationContract]
[WebInvoke(
Method = "POST",
RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "Work")]
XElement Work(Stream contents);

实现是:

public XElement Work(Stream contents)
{
     String xml = new StreamReader(contents).ReadToEnd();
     WorkManager workManager = new WorkManager();
     workManager.Work(xml);
}

XDocument的XML反序列化太慢

几个提示:

  1. 摆脱那个尝试/接球的障碍。它对你没有任何帮助,因为你总是throw;
  2. 不要调用CreateReader两次,并使用using块:

    using (var reader = parsedXML.CreateReader()) {
        if (serializer.CanDeserialize(reader))
        {
                **--This is where everything gets stuck--**
            dto = (T)serializer.Deserialize(reader);
        }
    }
    
相关文章: