【问题标题】:Deserialize XML document to object implementing IEnumerable / IEnumerable<T>将 XML 文档反序列化为实现 IEnumerable / IEnumerable<T> 的对象
【发布时间】: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


【解决方案1】:

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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多