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があります。シリアル化に問題はありません。次の文字列は、上記のシリアル化関数を使用して作成した例です。

<?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があります。1つは「NoCategory」という名前のRssCategoryで、空のRssListがあり、もう1つはXMLで定義されている正しいものです。つまり、1つの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 に答える