C# XDocument的XML反序列化太慢

C# XDocument的XML反序列化太慢,c#,wcf,serialization,deserialization,C#,Wcf,Serialization,Deserialization,我有一个很奇怪的问题。我有一个SQL Server数据库,它返回大量XML。在中间,我有.NET C代码。在前面,我有两个项目,一个是WCF,另一个是Console应用程序(仅用于测试) 现在,当我运行代码从DB获取XML并使用console应用程序对其进行反序列化时,它运行得非常快。但是,当我通过WCF运行相同的代码时,反序列化XML会花费很长时间。我确信,DB不是这里的瓶颈,但序列化程序是 我正在使用XmlSerializer。我无法切换到DataContractSerializer,因为我

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

现在,当我运行代码从DB获取XML并使用console应用程序对其进行反序列化时,它运行得非常快。但是,当我通过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); 
具体实施如下:

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

     WorkManager workManager = new WorkManager();
     workManager.Work(xml);
}
几点提示:

  • 摆脱那个“尝试/抓住”的障碍。它没有为你做任何事,因为你总是
  • 不要调用CreateReader两次,使用
    块使用

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

  • 你能发布你的WCF代码吗,特别是你正在进行序列化的那部分,因为你认为这是瓶颈吗?请看更新后的文章和代码。好多了。谢谢,我不是真的想解决你的问题!如果这解决了您的问题,那么您的问题要么是CreateReader需要很长时间(因此不应该调用两次),要么更可能是因为您没有处理XmlReader,所以您保留了资源。或者,因为您在同一个XML上创建了两个读卡器,但从未处理它们,所以它们相互干扰。我想知道
    使用
    是否提高了性能。只是没有足够的好奇心去亲自尝试:-)
    
    using (var reader = parsedXML.CreateReader()) {
        if (serializer.CanDeserialize(reader))
        {
                **--This is where everything gets stuck--**
            dto = (T)serializer.Deserialize(reader);
        }
    }