Dictionary(支持 XML 序列化),注意C#中原生的Dictionary类是无法进行Xml序列化的

 1     /// <summary>
 2     /// Dictionary(支持 XML 序列化)
 3     /// </summary>
 4     /// <typeparam name="TKey">键类型</typeparam>
 5     /// <typeparam name="TValue">值类型</typeparam>
 6     [XmlRoot("XmlDictionary")]
 7     [Serializable]
 8     public class XmlDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
 9     {
10         #region 构造函数
11         public XmlDictionary()
12         { }
13 
14         public XmlDictionary(IDictionary<TKey, TValue> dictionary) : base(dictionary)
15         { }
16 
17         public XmlDictionary(IEqualityComparer<TKey> comparer) : base(comparer)
18         { }
19 
20         public XmlDictionary(int capacity) : base(capacity)
21         { }
22 
23         public XmlDictionary(int capacity, IEqualityComparer<TKey> comparer) : base(capacity, comparer)
24         { }
25 
26         protected XmlDictionary(SerializationInfo info, StreamingContext context) : base(info, context)
27         { }
28         #endregion 构造函数
29 
30         #region IXmlSerializable Members
31         public XmlSchema GetSchema() => null;
32 
33         /// <summary>
34         ///     从对象的 XML 表示形式生成该对象(反序列化)
35         /// </summary>
36         /// <param name="xr"></param>
37         public void ReadXml(XmlReader xr)
38         {
39             if (xr.IsEmptyElement)
40                 return;
41             var ks = new XmlSerializer(typeof(TKey));
42             var vs = new XmlSerializer(typeof(TValue));
43             xr.Read();
44             while (xr.NodeType != XmlNodeType.EndElement)
45             {
46                 xr.ReadStartElement("Item");
47                 xr.ReadStartElement("Key");
48                 var key = (TKey)ks.Deserialize(xr);
49                 xr.ReadEndElement();
50                 xr.ReadStartElement("Value");
51                 var value = (TValue)vs.Deserialize(xr);
52                 xr.ReadEndElement();
53                 Add(key, value);
54                 xr.ReadEndElement();
55                 xr.MoveToContent();
56             }
57             xr.ReadEndElement();
58         }
59 
60         /// <summary>
61         ///     将对象转换为其 XML 表示形式(序列化)
62         /// </summary>
63         /// <param name="xw"></param>
64         public void WriteXml(XmlWriter xw)
65         {
66             var ks = new XmlSerializer(typeof(TKey));
67             var vs = new XmlSerializer(typeof(TValue));
68             foreach (var key in Keys)
69             {
70                 xw.WriteStartElement("Item");
71                 xw.WriteStartElement("Key");
72                 ks.Serialize(xw, key);
73                 xw.WriteEndElement();
74                 xw.WriteStartElement("Value");
75                 vs.Serialize(xw, this[key]);
76                 xw.WriteEndElement();
77                 xw.WriteEndElement();
78             }
79         }
80         #endregion IXmlSerializable Members
81     }
View Code

 

转载于:https://www.cnblogs.com/maozhh/p/6731672.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#XML序列化和反序列化是常用的技术,可以将对象转化为便于传输的XML格式,并且可以将XML格式的数据还原为对象。其XML序列化可以使用多种方式实现,比如二进制、字节数组、JSON字符串和XML字符串等。在C#,可以使用XmlSerializer的Serialize方法将对象序列化XML字符串,使用Deserialize方法将XML字符串反序列化为对象。\[1\] 在进行XML序列化时,可以通过设置XmlTextWriter的Formatting属性为Formatting.Indented来实现换行显示,使得生成的XML字符串更加可读。另外,需要注意的是,Dictionary本身不支持序列化,所以需要重写为可序列化的SerializableDictionary来实现对字典的序列化操作。\[2\] 对于XML序列化为对象,可以使用deserialize方法来实现。该方法接受一个XML字符串和一个型参数,通过使用XmlSerializer的Deserialize方法将XML字符串反序列化为指定型的对象。在反序列化过程,需要使用StringReader将XML字符串转化为可读的流,并使用XmlSerializer进行序列化操作。\[3\] #### 引用[.reference_title] - *1* *2* *3* [C# XML序列化和反序列化(XmlSerializer)](https://blog.csdn.net/sD7O95O/article/details/128783513)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值