【问题标题】:Deserialization with XmlSerializer使用 XmlSerializer 反序列化
【发布时间】:2013-01-21 10:50:07
【问题描述】:

我正在编写一个 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”且 RssList 为空的 RssCategory,另一个是 XML 中定义的正确一个;即带有一个 RssFeed 的“无类别”。

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

【问题讨论】:

标签: c# .net windows-8 xml-serialization windows-store-apps


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    试试这个并告诉我:

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

    【讨论】:

    • 这段代码和我在问题中提出的代码没有区别。问题出在被序列化的类的构造函数上。检查我的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多