C# XML反序列化触发InvalidOperationException,疑与命名空间相关
解决XML反序列化的命名空间匹配问题
你的问题确实源于XML中的命名空间未在C#类中正确配置。XML里所有带aaa:前缀的元素都属于http://www.example.com/config/1.0命名空间,但你的代码未指定该命名空间,导致序列化器无法匹配对应元素,抛出异常。
按以下方式修改代码即可解决:
[XmlRoot("MyRootElement", Namespace = "http://www.example.com/config/1.0")] public class ConfigInfo { public class Configuration { [XmlElement("Field1", Namespace = "http://www.example.com/config/1.0")] public string Field1 { get; set; } [XmlElement("Field2", Namespace = "http://www.example.com/config/1.0")] public string Field2 { get; set; } } [XmlArray("Configurations", Namespace = "http://www.example.com/config/1.0")] [XmlArrayItem("Configuration", Namespace = "http://www.example.com/config/1.0")] public List<Configuration> Configurations { get; set; } public static ConfigInfo FromMemoryStream(MemoryStream memoryStream) { var serializer = new XmlSerializer(typeof(ConfigInfo)); return (ConfigInfo)serializer.Deserialize(memoryStream); } }
关键改动说明:
- 给根类
ConfigInfo的XmlRoot特性添加Namespace属性,与XML中的xmlns:aaa="http://www.example.com/config/1.0"对应 - 集合属性
Configurations改用XmlArray和XmlArrayItem特性:XmlArray对应外层的<aaa:Configurations>节点,XmlArrayItem对应内部的每个<aaa:Configuration>节点,两者都指定统一命名空间 - 给
Configuration类的每个字段添加XmlElement特性并指定命名空间,匹配XML里的<aaa:Field1>和<aaa:Field2>节点
修改后,序列化器就能正确识别XML中的命名空间元素,完成反序列化操作。
内容的提问来源于stack exchange,提问作者Disti
相关产品推荐
相关产品推荐

