0
点赞
收藏
分享

微信扫一扫

XML Serializable Generic Dictionary

    .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
}

举报

相关推荐

0 条评论