C#如何XML反序列化Dictionary<string, List<string>>?遇CS0029错误
解决XML反序列化时的CS0029类型转换错误
CS0029错误的核心原因很明确:你把反序列化得到的CountriesAndCities对象直接赋值给了Dictionary<string, List
修复方案
修正反序列化赋值逻辑
在button11_Click方法中,先将反序列化结果转换为CountriesAndCities类型,再提取其DictCountriesAndCities属性赋值给字典变量:原错误代码:
dictCountryAndCities = serializer.Deserialize(reader) as CountriesAndCities;修改为:
var deserializedContainer = serializer.Deserialize(reader) as CountriesAndCities; if (deserializedContainer != null) { dictCountryAndCities = deserializedContainer.DictCountriesAndCities; }优化容器类的健壮性
对CountriesAndCities类做两处优化,避免空引用和语义混淆:- 将模糊的
Name属性重命名为Countries,更贴合其存储的内容 - 添加构造函数初始化
DictCountriesAndCities,同时在属性setter中处理空值
修改后的类代码:
[Serializable] [XmlRoot("CountriesAndCities")] public class CountriesAndCities { public CountriesAndCities() { DictCountriesAndCities = new Dictionary<string, List<string>>(); } public List<Country> Countries { get { return DictCountriesAndCities.Select(x => new Country { CountryName = x.Key, Cities = x.Value }).ToList(); } set { DictCountriesAndCities = value?.ToDictionary(x => x.CountryName, x => x.Cities) ?? new Dictionary<string, List<string>>(); } } [XmlIgnore] public Dictionary<string, List<string>> DictCountriesAndCities { get; set; } }- 将模糊的
添加空值保护
反序列化可能返回null(比如文件损坏或格式错误),添加空值判断可以避免后续绑定ListBox时出现NullReferenceException。
内容的提问来源于stack exchange,提问作者alphabeta
相关产品推荐
相关产品推荐

