0
|
1 using System;
|
|
2 using System.Collections.Generic;
|
|
3 using System.Xml;
|
|
4 using System.Xml.Schema;
|
|
5 using System.Xml.Serialization;
|
|
6
|
|
7 using BLToolkit.TypeBuilder;
|
|
8
|
|
9 namespace Demo.WebServices.ObjectModel
|
|
10 {
|
|
11 [Serializable]
|
|
12 public class XmlMap<TKey, TValue>: Dictionary<TKey, TValue>, IXmlSerializable
|
|
13 {
|
|
14 private const string KEY_NAME = "k";
|
|
15 private const string VALUE_NAME = "v";
|
|
16
|
|
17 private static readonly XmlSerializer<TKey> _keySerializer = new XmlSerializer<TKey>(KEY_NAME);
|
|
18 private static readonly XmlSerializer<TValue> _valueSerializer = new XmlSerializer<TValue>(VALUE_NAME);
|
|
19
|
|
20 #region IXmlSerializable members
|
|
21
|
|
22 XmlSchema IXmlSerializable.GetSchema()
|
|
23 {
|
|
24 return null;
|
|
25 }
|
|
26
|
|
27 void IXmlSerializable.ReadXml(XmlReader reader)
|
|
28 {
|
|
29 if (!reader.ReadToDescendant(KEY_NAME))
|
|
30 {
|
|
31 reader.Skip();
|
|
32 return;
|
|
33 }
|
|
34
|
|
35 do
|
|
36 {
|
|
37 Add(_keySerializer.Deserialize(reader),
|
|
38 _valueSerializer.Deserialize(reader));
|
|
39 }
|
|
40 while (reader.NodeType != XmlNodeType.EndElement);
|
|
41
|
|
42 reader.ReadEndElement();
|
|
43 }
|
|
44
|
|
45 void IXmlSerializable.WriteXml(XmlWriter writer)
|
|
46 {
|
|
47 foreach (KeyValuePair<TKey, TValue> pair in this)
|
|
48 {
|
|
49 _keySerializer .Serialize(writer, pair.Key);
|
|
50 _valueSerializer.Serialize(writer, pair.Value);
|
|
51 }
|
|
52 }
|
|
53
|
|
54 #endregion
|
|
55
|
|
56 private class XmlSerializer<T>
|
|
57 {
|
|
58 private readonly XmlSerializer _instance;
|
|
59
|
|
60 public XmlSerializer(string elementName)
|
|
61 {
|
|
62 _instance = new XmlSerializer(
|
|
63 TypeFactory.GetType(typeof(T)), new XmlRootAttribute(elementName));
|
|
64 }
|
|
65
|
|
66 public void Serialize(XmlWriter writer, T value)
|
|
67 {
|
|
68 _instance.Serialize(writer, value);
|
|
69 }
|
|
70
|
|
71 public T Deserialize(XmlReader reader)
|
|
72 {
|
|
73 return (T)_instance.Deserialize(reader);
|
|
74 }
|
|
75 }
|
|
76 }
|
|
77 } |