.net 2.0 泛型Dictionary不支持 XML serializable. 下面是一个实现IXmlSerializable 接口实现支持Serialize的泛型集合.Dictionary 。 Dictionary<TKey, TValue>本身实现了ISerializable接口,WebService中无法实现序列化,具体是什么原因它不支持XML序列化。
1
/**//// <summary>
2
/// 支持XML序列化的泛型 Dictionary
3
/// </summary>
4
/// <typeparam name="TKey"></typeparam>
5
/// <typeparam name="TValue"></typeparam>
6
[XmlRoot("dictionary")]
7
public class SerializableDictionary<TKey, TValue>
8
: Dictionary<TKey, TValue>, IXmlSerializable
9
{
10
#region 构造函数
public SerializableDictionary():base()
{ }
public SerializableDictionary(IDictionary<TKey, TValue> dictionary):base(dictionary)
{ }
public SerializableDictionary(IEqualityComparer<TKey> comparer):base(comparer)
{
}
public SerializableDictionary(int capacity):base(capacity)
{ }
public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)
:base(capacity,comparer)
{ }
protected SerializableDictionary(SerializationInfo info, StreamingContext context):base(info,context)
{ }
#endregion
11
IXmlSerializable Members#region IXmlSerializable Members
12
public System.Xml.Schema.XmlSchema GetSchema()
13
{
14
return null;
15
}
16
17
/**//// <summary>
18
/// 从对象的 XML 表示形式生成该对象
19
/// </summary>
20
/// <param name="reader"></param>
21
public void ReadXml(System.Xml.XmlReader reader)
22
{
23
24
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
25
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
26
bool wasEmpty = reader.IsEmptyElement;
27
reader.Read();
28
29
if (wasEmpty)
30
return;
31
while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
32
{
33
reader.ReadStartElement("item");
34
reader.ReadStartElement("key");
35
TKey key = (TKey)keySerializer.Deserialize(reader);
36
reader.ReadEndElement();
37
reader.ReadStartElement("value");
38
TValue value = (TValue)valueSerializer.Deserialize(reader);
39
reader.ReadEndElement();
40
this.Add(key, value);
41
reader.ReadEndElement();
42
reader.MoveToContent();
43
44
}
45
reader.ReadEndElement();
46
47
}
48
49
50
/**//// <summary>
51
/// 将对象转换为其 XML 表示形式
52
/// </summary>
53
/// <param name="writer"></param>
54
public void WriteXml(System.Xml.XmlWriter writer)
55
{
56
57
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
58
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
59
foreach (TKey key in this.Keys)
60
{
61
writer.WriteStartElement("item");
62
writer.WriteStartElement("key");
63
keySerializer.Serialize(writer, key);
64
writer.WriteEndElement();
65
writer.WriteStartElement("value");
66
TValue value = this[key];
67
valueSerializer.Serialize(writer, value);
68
writer.WriteEndElement();
69
writer.WriteEndElement();
70
}
71
72
}
73
74
#endregion
75
76
}
标签:XML,Generic,writer,Serializable,key,reader,XmlSerializer,public,SerializableDict From: https://blog.51cto.com/shanyou/5789600