5

我已經得到了Windows Phone 7的一些代碼,對於RSS應用:DataContractSerializer的失敗,空數據

private RSSSettings DeserializeSettings(string data) 
    { 
     RSSSettings rsssettings; 
     try 
     { 
      var ser = new DataContractSerializer(typeof(RSSSettings)); 
      using (var sr = new StringReader(data)) 
      using (var xr = XmlReader.Create(sr)) 
       rsssettings = (RSSSettings)ser.ReadObject(xr); 
     } 
     catch (Exception ex) 
     { 
      ex.ToString(); 
      rsssettings = new RSSSettings() { Version = -1 }; 
     } 
     return rsssettings; 
    } 

它完美地在Windows Phone 7我移植應用到Windows Phone 8,和一切除此片段外,其他應用程序都可以工作。

比較在Windows Phone 7和8中發生的情況,WP8中的「rsssettings」在WP7中正確填充時仍爲空。這部分代碼根本沒有代碼變更。

一切正常,直到形成:

rsssettings = (RSSSettings)ser.ReadObject(xr); 

異常不叫。

任何人都知道如何解決這個令人沮喪的問題?

+0

我會先比較兩者之間的數據對象的內容。他們是一樣的嗎? – Bryant

+0

數據對象完全一樣。這是什麼讓我如此迷惑:( – ReignOfComputer

+0

在這兩種情況下的數據都是XML,這兩種情況似乎都一直運載數據,直到我突出顯示的那條線。 – ReignOfComputer

回答

12

是的,你不會喜歡這個。

WP8上的DataContractSerializer要求XML元素按字母順序排列。自從DataContractSerializer中的所有內容都來自另一個DataContractSerializer之後,這就完成了。

我希望我能做到這一點,但我不是。從MSDN的App platform compatibility for Windows Phone

的DataContractSerializer類

WP8行爲:XML元素都必須按字母順序排序。

WP7行爲:XML元素可以是無序的。

有在這一點上你幾個選擇:

  1. 字母順序排序您的XML。不,這真的不是一種選擇。
  2. 由於看起來您正在獲取RSS,您可以考慮使用WCF的System.ServiceModel.Syndication.SyndicationFeed,它專門爲RSS/Atom構建。更多關於Den Delimarsky的great article
  3. 如果您使用非RSS XML,請考慮直接使用Xml Serialization和XmlSerializer。對於我的錢來說,這是通過XML串行化和反序列化完成的最好和最簡單的方法。
  4. 通過怪癖模式啓用從WP7到WP8的行爲更改。這意味着在WP8上運行的WP7應用程序仍然可以正常運行。如果您的應用沒有從WP8功能集中受益,則可以將整個應用保存爲WP7應用。
+0

Omg。好吧,這將是困難的:/ 謝謝! – ReignOfComputer