【问题标题】:XML Deserialization of an XDocument is too slowXDocument 的 XML 反序列化太慢
【发布时间】:2013-07-18 01:09:18
【问题描述】:

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

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

我正在使用 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); 

上面的语句是从 Console 应用和 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);
}

【问题讨论】:

  • 您能否发布您的 WCF 代码,特别是您进行序列化的部分,因为您认为这是瓶颈?
  • 请查看更新后的代码。

标签: c# wcf serialization deserialization


【解决方案1】:

几个提示:

  1. 摆脱那个 try/catch 块。它没有为你做任何事情,因为你总是throw;
  2. 不要调用 CreateReader 两次,并使用 using 块:

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

【讨论】:

  • 好多了。谢谢
  • 我并不是真的打算解决你的问题!如果这解决了您的问题,那么您的问题将是 CreateReader 需要很长时间(因此不应调用两次),或者更有可能是因为您没有处理 XmlReader,所以您一直在占用资源。或者,因为您在同一个 XML 上创建了两个读取器,并且从未处理它们,所以它们相互干扰。
  • 我很想知道using 是否提高了性能。只是不够好奇自己尝试一下:-)
猜你喜欢
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 2012-03-04
  • 2011-03-03
相关资源
最近更新 更多