跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

C#如何将Dictionary序列化为XML

C#中Dictionary不能直接用XmlSerializer序列化,需转为可序列化结构;推荐用带XmlElement的SerializableDictionary包装类,或用DataContractSerializer(支持泛型但XML冗余),也可转List轻量处理。 C# 中
Dictionary
不能直接用
XmlSerializer
序列化,因为
XmlSerializer
要求类型具有公共无参构造函数、公共读写属性,且不支持泛型字典的直接映射。需转换为可序列化的结构(如数组、列表或自定义包装类)后再处理。 使用包装类 + XmlSerializer(推荐) 定义一个包含
KeyValuePair
列表的容器类,让
XmlSerializer
能识别并生成标准 XML: 创建如
SerializableDictionary
类,内部用
List>
存储数据 提供
ToDictionary()
和
FromDictionary()
方法实现双向转换 为
KeyValuePair
的 Key/Value 添加 [XmlElement] 特性(注意:.NET 6+ 可直接序列化 KeyValuePair,旧版本建议封装为独立属性类) 示例关键代码:
[XmlRoot("Dictionary")] public class SerializableDictionary { [XmlElement("Item")] public List Items { get; set; } = new();
public SerializableDictionary() { }
public SerializableDictionary(Dictionary dict)
{
    foreach (var kvp in dict)
        Items.Add(new DictionaryEntry(kvp.Key, kvp.Value));
}

public Dictionary 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(支持泛型字典)
DataContractSerializer
原生支持
Dictionary
,无需额外包装,但生成的 XML 带命名空间和冗余结构(如
),可读性较差: C知道 CSDN推出的一款AI技术问答工具 下载 需为键值类型添加
[DataContract]
,键/值属性加
[DataMember]
序列化时指定
Dictionary
类型,不需中间类 适合内部服务通信,不太适合人读或与第三方 XML 约定交互 注意:若键或值是复杂类型,必须确保它们也标记为
DataContract
。 转为 List 后序列化(轻量替代) 如果只是临时导出、且键值类型简单(如 string/int),可跳过自定义类,直接转成列表再序列化:
var list = dict.ToList();
得到
List>
用
XmlSerializer
序列化该 list(需确保 KeyValuePair 的 Key/Value 是 public 属性;.NET Core 3.1+ 支持直接序列化 KeyValuePair) 生成的 XML 是扁平 item 列表,无“dictionary”语义,但结构清晰、易解析 避免踩坑的关键细节 常见问题 及应对: 键类型限制 :XML 元素名不能含特殊字符,若 key 是字符串且含空格/斜杠,建议用
[XmlAttribute]
存为属性而非元素,或预处理 key 名 空值处理 :默认
XmlSerializer
不序列化 null 值;若需保留,给属性加
[XmlElement(IsNullable = true)]
性能考虑 :大量数据时,优先选
XmlSerializer
预生成程序集(使用
XmlSerializer(Type)
构造一次缓存),避免每次新建开销 反序列化安全 :禁用
XmlSerializer.UnsafeDeserialize
,始终验证输入 XML 结构,防止 XXE 攻击

相关文章