wasSharp – Blame information for rev 27

Subversion Repositories:
Rev:
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);
27 office 42 var key = (TKey)KeySerializer.Deserialize(reader);
23 office 43 reader.ReadEndElement();
44  
45 reader.ReadStartElement(ValueNodeName);
27 office 46 var value = (TValue)ValueSerializer.Deserialize(reader);
23 office 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);
25 office 89 memoryStream.Position = 0;
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 }
27 office 96 /* cloning failed so return an empty dictionary */
10 office 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  
27 office 111 #endregion Constants
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  
27 office 144 #endregion Constructors
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  
27 office 153 #endregion Private Properties
23 office 154  
155 #region Private Members
156  
157 private XmlSerializer keySerializer;
158 private XmlSerializer valueSerializer;
159  
27 office 160 #endregion Private Members
10 office 161 }
27 office 162 }