C#反序列化XML文件时触发System.InvalidOperationException异常
解决C# XML反序列化异常问题
问题原因
当前代码存在两个关键错误:
[XmlRoot("Users")]特性被错误添加到User类上,但实际要反序列化的是List<User>集合,该特性对集合无效。- 默认情况下,
XmlSerializer处理List<User>时预期根节点为<ArrayOfUser>,但你的XML文件根节点是<Users>,结构不匹配导致抛出异常。
解决方案
方案一:创建根类匹配XML结构
定义包含User列表的根类,将[XmlRoot("Users")]特性添加到该类,并通过[XmlElement("User")]标记列表属性,确保XML中的<User>元素被正确映射:
namespace Biftek { [XmlRoot("Users")] public class UserList { [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) { List<User> users = new List<User>(); if (File.Exists(path)) { XmlSerializer serializer = new XmlSerializer(typeof(UserList)); using (XmlReader reader = XmlReader.Create(path)) { var userList = (UserList)serializer.Deserialize(reader); users = userList.Users; } } return users; } } }
方案二:直接指定序列化器的根节点
无需创建新类,实例化XmlSerializer时通过XmlRootAttribute指定根节点名称为Users,同时给User类添加[XmlElement("User")]特性,确保集合元素对应XML中的<User>标签:
namespace Biftek { [XmlElement("User")] 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>), new XmlRootAttribute("Users")); using (XmlReader reader = XmlReader.Create(path)) { users = (List<User>)serializer.Deserialize(reader); } } return users; } } }
两种方案均可解决根节点不匹配的问题,任选其一即可。
内容的提问来源于stack exchange,提问作者StraleS02
相关产品推荐
相关产品推荐

