wasSharp – Blame information for rev 23
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
10 | office | 1 | /////////////////////////////////////////////////////////////////////////// |
2 | // Copyright (C) Wizardry and Steamworks 2013 - License: GNU GPLv3 // |
||
3 | // Please see: http://www.gnu.org/licenses/gpl.html for legal details, // |
||
4 | // rights of fair usage, the disclaimer and warranty conditions. // |
||
5 | /////////////////////////////////////////////////////////////////////////// |
||
6 | |||
7 | using System; |
||
8 | using System.Collections.Generic; |
||
9 | using System.IO; |
||
10 | using System.Xml; |
||
11 | using System.Xml.Schema; |
||
12 | using System.Xml.Serialization; |
||
13 | |||
14 | namespace wasSharp.Collections.Generic |
||
15 | { |
||
16 | /// <summary> |
||
17 | /// A serializable dictionary class. |
||
18 | /// </summary> |
||
19 | /// <typeparam name="TKey">the key</typeparam> |
||
20 | /// <typeparam name="TValue">the value</typeparam> |
||
21 | public class SerializableDictionary<TKey, TValue> |
||
22 | : Dictionary<TKey, TValue>, IXmlSerializable |
||
23 | { |
||
23 | office | 24 | public XmlSchema GetSchema() |
25 | { |
||
26 | return null; |
||
27 | } |
||
10 | office | 28 | |
23 | office | 29 | public void ReadXml(XmlReader reader) |
10 | office | 30 | { |
23 | office | 31 | if (reader.IsEmptyElement) |
10 | office | 32 | { |
23 | office | 33 | return; |
10 | office | 34 | } |
23 | office | 35 | |
36 | reader.ReadStartElement(); |
||
37 | while (!reader.NodeType.Equals(XmlNodeType.EndElement)) |
||
38 | { |
||
39 | reader.ReadStartElement(ItemNodeName); |
||
40 | |||
41 | reader.ReadStartElement(KeyNodeName); |
||
42 | var key = (TKey) KeySerializer.Deserialize(reader); |
||
43 | reader.ReadEndElement(); |
||
44 | |||
45 | reader.ReadStartElement(ValueNodeName); |
||
46 | var value = (TValue) ValueSerializer.Deserialize(reader); |
||
47 | reader.ReadEndElement(); |
||
48 | |||
49 | Add(key, value); |
||
50 | |||
51 | reader.ReadEndElement(); |
||
52 | reader.MoveToContent(); |
||
53 | } |
||
54 | reader.ReadEndElement(); |
||
10 | office | 55 | } |
56 | |||
23 | office | 57 | public void WriteXml(XmlWriter writer) |
10 | office | 58 | { |
23 | office | 59 | foreach (var key in Keys) |
60 | { |
||
61 | writer.WriteStartElement(ItemNodeName); |
||
62 | |||
63 | writer.WriteStartElement(KeyNodeName); |
||
64 | KeySerializer.Serialize(writer, key); |
||
65 | writer.WriteEndElement(); |
||
66 | |||
67 | writer.WriteStartElement(ValueNodeName); |
||
68 | ValueSerializer.Serialize(writer, this[key]); |
||
69 | writer.WriteEndElement(); |
||
70 | |||
71 | writer.WriteEndElement(); |
||
72 | } |
||
10 | office | 73 | } |
74 | |||
75 | /// <summary> |
||
76 | /// Deep-clones the serializable dictionary. |
||
77 | /// </summary> |
||
78 | /// <returns>a deep clone of the original dictionary</returns> |
||
79 | public SerializableDictionary<TKey, TValue> Clone() |
||
80 | { |
||
81 | SerializableDictionary<TKey, TValue> clone; |
||
82 | try |
||
83 | { |
||
23 | office | 84 | using (var memoryStream = new MemoryStream()) |
10 | office | 85 | { |
23 | office | 86 | new XmlSerializer( |
87 | typeof(SerializableDictionary<TKey, TValue>), new XmlRootAttribute(DictionaryNodeName)) |
||
88 | .Serialize(memoryStream, this); |
||
89 | memoryStream.Seek(0, SeekOrigin.Begin); |
||
10 | office | 90 | clone = (SerializableDictionary<TKey, TValue>) |
91 | new XmlSerializer( |
||
23 | office | 92 | typeof(SerializableDictionary<TKey, TValue>), new XmlRootAttribute(DictionaryNodeName)) |
93 | .Deserialize(memoryStream); |
||
10 | office | 94 | } |
95 | } |
||
96 | /* cloning failed so return an empty dictionary */ |
||
97 | catch (Exception) |
||
98 | { |
||
99 | clone = new SerializableDictionary<TKey, TValue>(); |
||
100 | } |
||
101 | return clone; |
||
102 | } |
||
103 | |||
23 | office | 104 | #region Constants |
10 | office | 105 | |
23 | office | 106 | public string DictionaryNodeName { get; set; } = "Dictionary"; |
107 | public string ItemNodeName { get; set; } = "Item"; |
||
108 | public string KeyNodeName { get; set; } = "Key"; |
||
109 | public string ValueNodeName { get; set; } = "Value"; |
||
10 | office | 110 | |
23 | office | 111 | #endregion |
10 | office | 112 | |
23 | office | 113 | #region Constructors |
10 | office | 114 | |
23 | office | 115 | public SerializableDictionary() |
116 | { |
||
117 | } |
||
10 | office | 118 | |
23 | office | 119 | public SerializableDictionary(IDictionary<TKey, TValue> dictionary) |
120 | : base(dictionary) |
||
121 | { |
||
122 | } |
||
10 | office | 123 | |
23 | office | 124 | public SerializableDictionary(IEqualityComparer<TKey> comparer) |
125 | : base(comparer) |
||
126 | { |
||
127 | } |
||
10 | office | 128 | |
23 | office | 129 | public SerializableDictionary(int capacity) |
130 | : base(capacity) |
||
131 | { |
||
132 | } |
||
10 | office | 133 | |
23 | office | 134 | public SerializableDictionary(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer) |
135 | : base(dictionary, comparer) |
||
136 | { |
||
10 | office | 137 | } |
138 | |||
23 | office | 139 | public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer) |
140 | : base(capacity, comparer) |
||
10 | office | 141 | { |
23 | office | 142 | } |
10 | office | 143 | |
23 | office | 144 | #endregion |
10 | office | 145 | |
23 | office | 146 | #region Private Properties |
10 | office | 147 | |
23 | office | 148 | protected XmlSerializer ValueSerializer |
149 | => valueSerializer ?? (valueSerializer = new XmlSerializer(typeof(TValue))); |
||
10 | office | 150 | |
23 | office | 151 | private XmlSerializer KeySerializer => keySerializer ?? (keySerializer = new XmlSerializer(typeof(TKey))); |
10 | office | 152 | |
153 | #endregion |
||
23 | office | 154 | |
155 | #region Private Members |
||
156 | |||
157 | private XmlSerializer keySerializer; |
||
158 | private XmlSerializer valueSerializer; |
||
159 | |||
160 | #endregion |
||
10 | office | 161 | } |
162 | } |