2014-01-21 16 views
1

我有一個類。我想將XML文件反序列化到這個類中。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]填充數組,雖然我可以填充字段?

+1

''[Serializable]'與'XmlSerializer'沒有任何關係。它啓用二進制序列化。 –

+0

如果我不使用[Serializable]我怎樣才能讓類被序列化。而我的問題不是關於[Serializable]。但是,謝謝 –

+1

XML序列化沒有*啓用*。它*只是工作*。各種* [Xml ...] *屬性在這裏進一步控制細節。 –

回答

2

檢查發生了什麼的最簡單方法是創建類的對象並將其序列化爲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相匹配,這就是爲什麼你不能在沒有XML的情況下反序列化你的XML [XmlElement]屬性 - ,因爲你的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類。