【发布时间】:2014-11-08 15:48:34
【问题描述】:
我有一个这样的 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 而不是用户数组。
【问题讨论】:
-
您确定要为此使用内置的 XML 序列化吗?对于类似的情况,我通常会使用手写的 LINQ to XML - 通常非常简单。
-
为什么不使用
UserData包装器:foreach (User user in myUserDataInstance.Users) { ... }迭代Users?你绝对可以让IEnumerable工作,但我认为这只是开销。 -
@Jon:到目前为止,我也一直使用 LINQ。我只是好奇它如何与内置的序列化程序一起工作。所以我试了一下。但现在我挂在这个问题上。
标签: c# serialization ienumerable xml-deserialization