[英]Deserialize XML document to object implementing IEnumerable / IEnumerable<T>
我有一個像這樣的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<UserData>
<Users>
<User>
<Name>TestName1</Name>
<Password>Password1</Password>
<Level>1</Level>
</User>
<User>
<Name>TestName2</Name>
<Password>PAssword2</Password>
<Level>2</Level>
</User>
</Users>
</UserData>
基於該XML結構,我使用以下兩個類對其進行反序列化:
[Serializable()]
public sealed class User
{
[System.Xml.Serialization.XmlElement("Name")]
public string Name { get; set; }
[System.Xml.Serialization.XmlElement("Password")]
public string Password { get; set; }
[System.Xml.Serialization.XmlElement("Level")]
public string Level { get; set; }
}
[System.Xml.Serialization.XmlRoot("UserData")]
public class UserData
{
[XmlArray("Users")]
[XmlArrayItem("User", typeof(User))]
public User[] Users { get; set; }
}
反序列化的實現如下所示:
private void ParseXMLCfg()
{
StreamReader reader = new StreamReader(_cfgFileDir);
try
{
XmlSerializer serializer = new XmlSerializer(typeof(UserData));
_users = (UserData)serializer.Deserialize(reader);
}
catch (InvalidOperationException e)
{
_logger.DebugFormat("{0}", e);
}
reader.Close();
}
到目前為止一切正常。 但是我的問題是我的類沒有實現IEnumerable。 所以我不能使用foreach遍歷數組。 如何對我的UserData
類實現IEnumerable?
我的方法之一是這樣的:
[System.Xml.Serialization.XmlRoot("UserData")]
public class UserData:IEnumerable
{
[XmlArray("Users")]
[XmlArrayItem("User", typeof(User))]
public User[] Users { get; set; }
// IEnumerable Member
public IEnumerator GetEnumerator()
{
foreach (object o in Users)
{
if(o == null)
{
break;
}
yield return o;
}
}
}
但這行不通。
為此類實現IEnumerable的方法是什么? 還有一種實現IEnumerable的方法,因為最后我想反序列化為List而不是用戶數組。
Users[]
已經實現了IEnumerable
,因此您不必自己進行實現。 只需調用基礎對象之一:
// IEnumerable Member
public IEnumerator GetEnumerator()
{
return Users.GetEnumerator();
}
當您使用它時,最好實現IEnumerable
的通用版本:
[System.Xml.Serialization.XmlRoot("UserData")]
public class UserData : IEnumerable<User>
{
[XmlArray("Users")]
[XmlArrayItem("User", typeof(User))]
public User[] Users { get; set; }
// IEnumerable Member
public IEnumerator GetEnumerator()
{
return this.Users.GetEnumerator();
}
IEnumerator<User> IEnumerable<User>.GetEnumerator()
{
return ((IEnumerable<User>)this.Users).GetEnumerator();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.