Mirror of Svelto.ECS because we're a fan of it
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SerializableDictionary.cs 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #define XML_ENABLED
  2. using System;
  3. using System.Runtime.Serialization;
  4. #if XML_ENABLED
  5. using System.Xml;
  6. using System.Xml.Serialization;
  7. #endif
  8. using System.Collections.Generic;
  9. [Serializable()]
  10. public struct KeyValueSerialization<TKey, TVal>
  11. {
  12. public TKey Key;
  13. public TVal Value;
  14. }
  15. [Serializable()]
  16. public class SerializableDictionary<TKey, TVal> : Dictionary<TKey, TVal>,
  17. #if XML_ENABLED
  18. IXmlSerializable,
  19. #endif
  20. ISerializable
  21. {
  22. #region Constants
  23. private const string DictionaryNodeName = "Dictionary";
  24. private const string ItemNodeName = "Item";
  25. private const string KeyNodeName = "Key";
  26. private const string ValueNodeName = "Value";
  27. #endregion
  28. #region Constructors
  29. public SerializableDictionary()
  30. {
  31. }
  32. public SerializableDictionary(IDictionary<TKey, TVal> dictionary)
  33. : base(dictionary)
  34. {
  35. }
  36. public SerializableDictionary(IEqualityComparer<TKey> comparer)
  37. : base(comparer)
  38. {
  39. }
  40. public SerializableDictionary(int capacity)
  41. : base(capacity)
  42. {
  43. }
  44. public SerializableDictionary(IDictionary<TKey, TVal> dictionary, IEqualityComparer<TKey> comparer)
  45. : base(dictionary, comparer)
  46. {
  47. }
  48. public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)
  49. : base(capacity, comparer)
  50. {
  51. }
  52. #endregion
  53. #region ISerializable Members
  54. public SerializableDictionary(SerializationInfo info, StreamingContext context)
  55. {
  56. int itemCount = info.GetInt32("count");
  57. for (int i = 0; i < itemCount; i++)
  58. {
  59. KeyValueSerialization<TKey, TVal> kvp = (KeyValueSerialization<TKey, TVal>)info.GetValue(String.Format("Im{0}", i), typeof(KeyValueSerialization<TKey, TVal>));
  60. this.Add(kvp.Key, kvp.Value);
  61. }
  62. }
  63. void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
  64. {
  65. info.AddValue("count", this.Count);
  66. int itemIdx = 0;
  67. foreach (KeyValuePair<TKey, TVal> kvp in this)
  68. {
  69. KeyValueSerialization<TKey, TVal> kvs = new KeyValueSerialization<TKey, TVal>();
  70. kvs.Key = kvp.Key;
  71. kvs.Value = kvp.Value;
  72. info.AddValue(String.Format("Im{0}", itemIdx), kvs, typeof(KeyValueSerialization<TKey, TVal>));
  73. itemIdx++;
  74. }
  75. }
  76. #endregion
  77. #if XML_ENABLED
  78. #region IXmlSerializable Members
  79. void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
  80. {
  81. //writer.WriteStartElement(DictionaryNodeName);
  82. foreach (KeyValuePair<TKey, TVal> kvp in this)
  83. {
  84. writer.WriteStartElement(ItemNodeName);
  85. writer.WriteStartElement(KeyNodeName);
  86. KeySerializer.Serialize(writer, kvp.Key);
  87. writer.WriteEndElement();
  88. writer.WriteStartElement(ValueNodeName);
  89. ValueSerializer.Serialize(writer, kvp.Value);
  90. writer.WriteEndElement();
  91. writer.WriteEndElement();
  92. }
  93. //writer.WriteEndElement();
  94. }
  95. void IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
  96. {
  97. if (reader.IsEmptyElement)
  98. {
  99. return;
  100. }
  101. // Move past container
  102. if (!reader.Read())
  103. {
  104. throw new XmlException("Error in Deserialization of Dictionary");
  105. }
  106. //reader.ReadStartElement(DictionaryNodeName);
  107. while (reader.NodeType != XmlNodeType.EndElement)
  108. {
  109. reader.ReadStartElement(ItemNodeName);
  110. reader.ReadStartElement(KeyNodeName);
  111. TKey key = (TKey)KeySerializer.Deserialize(reader);
  112. reader.ReadEndElement();
  113. reader.ReadStartElement(ValueNodeName);
  114. TVal value = (TVal)ValueSerializer.Deserialize(reader);
  115. reader.ReadEndElement();
  116. reader.ReadEndElement();
  117. this.Add(key, value);
  118. reader.MoveToContent();
  119. }
  120. //reader.ReadEndElement();
  121. reader.ReadEndElement(); // Read End Element to close Read of containing node
  122. }
  123. System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema()
  124. {
  125. return null;
  126. }
  127. #endregion
  128. #region Private Properties
  129. protected XmlSerializer ValueSerializer
  130. {
  131. get
  132. {
  133. if (valueSerializer == null)
  134. {
  135. valueSerializer = new XmlSerializer(typeof(TVal));
  136. }
  137. return valueSerializer;
  138. }
  139. }
  140. private XmlSerializer KeySerializer
  141. {
  142. get
  143. {
  144. if (keySerializer == null)
  145. {
  146. keySerializer = new XmlSerializer(typeof(TKey));
  147. }
  148. return keySerializer;
  149. }
  150. }
  151. #endregion
  152. #region Private Members
  153. private XmlSerializer keySerializer = null;
  154. private XmlSerializer valueSerializer = null;
  155. #endregion
  156. #endif
  157. }