2013-07-18 43 views
0

我有一個很奇怪的問題。我有SQL Server數據庫,它返回大量的XML。在中間我有.Net C#代碼。在前面我有兩個項目,一個是WCF,另一個是控制檯應用程序(僅用於測試)。XDocument的XML反序列化太慢了

現在,當我運行代碼從數據庫獲取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); 

並從控制檯應用程序和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); 
} 
+0

您可以發佈您的WCF的代碼,特別是你所在的部分做序列化,因爲你認爲這是瓶頸? –

+0

請使用代碼查看更新後的帖子。 – user2483744

回答

0

一對夫婦的提示:

  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); 
        } 
    } 
    
+0

好得多。謝謝 – user2483744

+1

我其實並沒有打算解決你的問題!如果這解決了你的問題,那麼你的問題可能是CreateReader需要很長時間(所以不應該被調用兩次),或者更可能的是,因爲你沒有配置XmlReader,所以你需要佔用資源。或者,因爲您在同一個XML上創建了兩個讀者,並且從不處理它們,所以它們互相干擾。 –

+0

你可能是對的。我應該用過。 – user2483744