

新闻资讯
技术学院C#中Dictionary不能直接用XmlSerializer序列化,需转为可序列化结构;推荐用带XmlElement的SerializableDictionary包装类,或用DataContractSerializer(支持泛型但XML冗余),也可转List轻量处理。
C# 中 Dictionary 不能直接用 XmlSerializer 序列化,因为 XmlSerializer 要求类型具有公共无参构造函数、公共读写属性,且不支持泛型字典的直接映射。需转换为可序列化的结构(如数组、列表或自定义包装类)后再处理。
定义一个包含 KeyValuePair 列表的容器类,让 XmlSerializer 能识别并生成标准 XML:
SerializableDictionary 类,内部用 List> 存储数据ToDictionary() 和 FromDictionary() 方法实现双向转换KeyValuePair 的 Key/Value 添加 [XmlElement] 特性(注意:.NET 6+ 可直接序列化 KeyValuePair,旧版本建议封装为独立属性类)示例关键代码:
[XmlRoot("Dictionary")]
public class SerializableDictionary
{
[XmlEl
ement("Item")]
public List Items { get; set; } = new();
public SerializableDictionary() { }
public SerializableDictionary(DictionaryzuojiankuohaophpcnK, Vyoujiankuohaophpcn dict)
{
foreach (var kvp in dict)
Items.Add(new DictionaryEntry(kvp.Key, kvp.Value));
}
public DictionaryzuojiankuohaophpcnK, Vyoujiankuohaophpcn ToDictionary() =>
Items.ToDictionary(x => (K)x.Key, x => (V)x.Value);}
public class DictionaryEntry
{
[XmlElement("Key")] public object Key { get; set; }
[XmlElement("Value")] public object Value { get; set;
public DictionaryEntry() { }
public DictionaryEntry(object key, object value) => (Key, Value) = (key, value);
}
DataContractSerializer 原生支持 Dictionary,无需额外包装,但生成的 XML 带命名空间和冗余结构(如 ),可读性较差:
[DataContract],键/值属性加 [DataMember]
Dictionary 类型,不需中间类注意:若键或值是复杂类型,必须确保它们也标记为 DataContract。
如果只是临时导出、且键值类型简单(如 string/int),可跳过自定义类,直接转成列表再序列化:
var list = dict.ToList(); 得到 List>
XmlSerializer 序列化该 list(需确保 KeyValuePair 的 Key/Value 是 public 属性;.NET Core 3.1+ 支持直接序列化 KeyValuePair)常见问题及应对:
[XmlAttribute] 存为属性而非元素,或预处理 key 名XmlSerializer 不序列化 null 值;若需保留,给属性加 [XmlElement(IsNullable = true)]
XmlSerializer 预生成程序集(使用 XmlSerializer(Type) 构造一次缓存),避免每次新建开销XmlSerializer.UnsafeDeserialize,始终验证输入 XML 结构,防止 XXE 攻击