代码之家  ›  专栏  ›  技术社区  ›  StraleS02

在C中反序列化xml文件时发生异常#

  •  0
  • StraleS02  · 技术社区  · 2 年前

    namespace Biftek
    {
        [XmlRoot("Users")]
       
        public class User
        {
            public string username { get; set; }
            public string password { get; set; }
        }
        public class UserManager
        {
            public static List<User> Load(string path)
            {
                List<User> users = new List<User>();
                if(File.Exists(path))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(List<User>));
                    using (XmlReader reader = XmlReader.Create(path))
                    {
                        users = (List<User>)serializer.Deserialize(reader);
                    }
                }
                return users;
            }
        }
    }
    

    XML文件:

    <?xml version="1.0" encoding="utf-8" ?>
    <Users>
        <User>
            <username>admin</username>
            <password>admin</password>
        </User>
        <User>
            <username>user</username>
            <password>user</password>
        </User>
    </Users>
    

    例外情况: 系统InvalidOperationException:“XML文档(2,2)中存在错误。”

    内部异常 InvalidOperationException:<用户xmlns=''>不应为。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Gabriel Ribeiro Rossi    2 年前

    在您的代码中,XmlSerializer期望反序列化List,但您的XML文件是使用包含用户元素的根元素构建的。

    namespace Biftek
    {
        [XmlRoot("Users")]
        public class UsersList
        {
            [XmlElement("User")]
            public List<User> Users { get; set; } = new List<User>();
        }
    
       public class User
       {
            public string username { get; set; }
            public string password { get; set; }
        }
    
        public class UserManager
        {
            public static List<User> Load(string path)
            {
                UsersList usersList = new UsersList();
                if(File.Exists(path))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(UsersList));
                    using (XmlReader reader = XmlReader.Create(path))
                    {
                        usersList = (UsersList)serializer.Deserialize(reader);
                    }
                }
                return usersList.Users;
            }
        }
    }