[英]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
應用於此類字段或屬性,則數組中的項目將編碼為一系列元素,嵌套在以該字段或屬性命名的元素下。 (使用XmlArrayAttribute
和XmlArrayItemAttribute
屬性來控制數組的序列化方式。)
您可以通過將類結構更改為
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.