2013-01-21 147 views
0

我在寫一個Windows應用商店應用程序,我需要在漫遊存儲中存儲一些數據;爲此我需要序列化/反序列化一些數據。我的串行器/解串器功能如下:使用XmlSerializer反序列化

public string Serialize() 
    { 
     try 
     { 
      StringWriter sw = new StringWriter(); 

      XmlSerializer xs = new XmlSerializer(typeof(RssData)); 
      xs.Serialize(sw, this); 


      return sw.ToString(); 
     } 
     catch (Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine(ex); 
      return String.Empty; 
     } 
    } 

    public void Deserialize(string serialized) 
    { 
     try 
     { 
      XmlSerializer xs = new XmlSerializer(typeof(RssData)); 
      XmlReader xr = XmlReader.Create(new StringReader(serialized)); 
      RssData rd = xs.Deserialize(xr) as RssData; 
      this.categoryList = rd.categoryList; 
      this.defaultCategory = rd.defaultCategory; 
     } 
     catch(Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine(ex); 
     } 
    } 

綜上所述,RssData有RssCategory的列表,每個RssCategory擁有的RSSFeed。有與序列化沒有問題,下面的字符串是,我已經使用上面的序列化函數產生的示例:

<?xml version="1.0" encoding="utf-16"?> 
<RssData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <CategoryList> 
    <RssCategory> 
     <Name>No Category</Name> 
     <RssList> 
     <RssFeed> 
      <Title>HABERTURK.COM</Title> 
      <Url>http://www.haberturk.com/rss</Url> 
      <Image>http://www.haberturk.com/images/htklogo2.jpg</Image> 
      <Subtitle>HABERTÜRK - Türkiye'nin En Büyük İnternet Gazetesi</Subtitle> 
     </RssFeed> 
     </RssList> 
    </RssCategory> 
    </CategoryList> 
</RssData> 

然而,當我反序列化這個XML,將所得RssData具有2個RssCategories,一個一個所屬分類是一個名爲「No Category」的RssCategory,它帶有一個空的RssList,另一個是在XML中定義的正確的一個;即具有一個RssFeed的「無分類」。

這是我的代碼問題還是XmlSerializer竊聽?

+0

對不起,我重複:http://stackoverflow.com/questions/9589589/deserializing-listint-with-xmlserializer-causing-extra-items? rq = 1 – mostruash

回答

1

好吧,似乎XmlSerializer首先使用其無參數構造函數構造對象,然後將XML中的每個項目添加到適當的列表中。因此,如果構造函數向該列表添加一些項目,則反序列化將導致包含構造函數中添加的任何項目的列表。編輯:所以,如果你序列化/反序列化一個類型爲Array/List/Container等屬性的類,在無參數構造函數中,你必須初始化它,但不要添加任何東西。

0

嘗試了這一點,並告訴我:

Class c = new Class(); //class name of data which was serialized
using (var sr = new StringReader(Serialized data, wherever you are fetching it from)
{
var xs = new XmlSerializer(typeof(Class));
c= (Class)xs.Deserialize(sr);
}

+0

這段代碼和我的代碼在我的問題中沒有區別。問題在於正在序列化的類的構造函數。檢查我的答案。 – mostruash

相關問題