簡體   English   中英

XML反序列化數組

[英]XML Deserialization Array

我有課 我想反序列化XML文件到此類。

public partial class Form1 : Form
{
    public string xmlFile;

    public Form1()
    {
        InitializeComponent();
        xmlFile = "Sample.xml";
    }

    [Serializable]
    public class Application
    {
        public string AppName;
        public string UpdateDetail;
    };

    [Serializable]
    public class Applications
    {
        [XmlElement]
        public Application[] Application;
    };



    [Serializable]
    public class Pmsp_Update
    {
        public string OldVersion;
        public string NewVersion;
        public Applications Applications;
    };

    private void btnRead_Click(object sender, EventArgs e)
    {
        XmlReader reader = XmlReader.Create(xmlFile);
        XmlSerializer ser = new XmlSerializer(typeof(Pmsp_Update));
        Pmsp_Update pu;
        using (reader = XmlReader.Create(xmlFile))
        {
            pu = (Pmsp_Update)ser.Deserialize(reader);
        }
    }
}

這是XML:

<Pmsp_Update>
  <OldVersion>v4.0.0</OldVersion>
  <NewVersion>v4.0.1</NewVersion>
  <Applications>
    <Application>
      <AppName>SampleApp</AppName>
      <UpdateDetail>sample</UpdateDetail>
     </Application>
  </Applications>
</Pmsp_Update>

我想問一下屬性。 我只使用了[Serializable]屬性,就可以得到該類。 我不使用任何[XmlElement]屬性,除了一個屬性外,它沒有引起任何錯誤。

如果我這樣使用,我可以填充數組,但是:

        [Serializable]
        public class Applications
        {
            [XmlElement]
            public Application[] Application;
        };

如果我這樣使用,則無法填充數組:

[Serializable]
public class Applications
{
    public Application[] Application;
};

所以,我的問題是這樣的:我沒有對字段使用[XmlElement] ,並且一切正常,但是無法填充數組。 盡管我可以填充字段,但是當我不使用[XmlElement]時為什么不能填充數組?

檢查正在發生什么的最簡單方法是創建類的對象並將其序列化為XML。 這是我得到的:

沒有[XmlElement]

<?xml version="1.0" encoding="utf-16"?>
<Pmsp_Update xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <OldVersion>v4.0.0</OldVersion>
  <NewVersion>v.4.0.1</NewVersion>
  <Applications>
    <Application>
      <Application>
        <AppName>Test</AppName>
        <UpdateDetail>test</UpdateDetail>
      </Application>
    </Application>
  </Applications>
</Pmsp_Update>

使用[XmlElement]

<?xml version="1.0" encoding="utf-16"?>
<Pmsp_Update xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <OldVersion>v4.0.0</OldVersion>
  <NewVersion>v.4.0.1</NewVersion>
  <Applications>
    <Application>
      <AppName>Test</AppName>
      <UpdateDetail>test</UpdateDetail>
    </Application>
  </Applications>
</Pmsp_Update>

如您所見,只有第二個匹配您的輸入XML,這就是為什么沒有[XmlElement]屬性就不能反序列化XML的原因- 因為您的XML文檔與您的類結構不匹配

數組屬性頂部的XmlElement為空,防止序列化程序期望其他元素處理數組元素。 MSDN上描述了該行為: XmlElementAttribute Class

如果將XmlElementAttribute應用於返回數組的字段或屬性,則數組中的項目將編碼為XML元素序列。

相反,如果未將XmlElementAttribute應用於此類字段或屬性,則數組中的項目將編碼為一系列元素,嵌套在以該字段或屬性命名的元素下。 (使用XmlArrayAttributeXmlArrayItemAttribute屬性來控制數組的序列化方式。)

您可以通過將類結構更改為

public class Application
{
    public string AppName;
    public string UpdateDetail;
};

public class Pmsp_Update
{
    public string OldVersion;
    public string NewVersion;
    public Application[] Applications;
};

<Applications>元素將自動添加為數組屬性,因此您不需要Applications類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM