0

我正在编写一个 Windows 应用商店应用程序,我需要在漫游存储中存储一些数据;为此,我需要序列化/反序列化一些数据。我的序列化器/反序列化器功能如下:

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。序列化没有问题,以下字符串是我使用上面的 Serialize 函数生成的示例:

<?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 的 CategoryList,一个是名为“No Category”的 RssCategory,带有一个空 RssList,另一个是 XML 中定义的正确一个;即带有一个 RssFeed 的“无类别”。

是我的代码有问题还是 XmlSerializer 有问题?

4

2 回答 2

1

好的,似乎 XmlSerializer 首先使用其无参数构造函数构造对象,然后将 XML 中的每个项目添加到适当的列表中。因此,如果构造函数将一些项目添加到该列表中,反序列化将生成一个列表,其中包含构造函数中添加的任何项目。

编辑:因此,如果您对具有 Array/List/Container 等类型属性的类进行序列化/反序列化,则必须在无参数构造函数中对其进行初始化,但不要向其中添加任何内容。

于 2013-01-21T11:04:00.543 回答
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);
}

于 2013-01-21T11:18:31.790 回答