Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Not without using another serialization library or implementing serialization yourself. Neither Hashtable or Dictionary are serializable out of the box in .NET. There is an implementation of a SerializableDictionary <a href="http://www.dacris.com/blog/2010/07/31/c-serializable-dictionary-a-working-example/" rel="noreferrer">here</a> that does both XML and binary serialization.</p> <p>Here is the code from the link (Copyright (c) Dacris Software Inc. MIT license):</p> <pre class="lang-cs prettyprint-override"><code>using System; using System.Runtime.Serialization; using System.Xml; using System.Xml.Serialization; using System.Collections.Generic; using System.Text; [Serializable()] public class SerializableDictionary&lt;TKey, TVal&gt; : Dictionary&lt;TKey, TVal&gt;, IXmlSerializable, ISerializable { #region Constants private const string DictionaryNodeName = "Dictionary"; private const string ItemNodeName = "Item"; private const string KeyNodeName = "Key"; private const string ValueNodeName = "Value"; #endregion #region Constructors public SerializableDictionary() { } public SerializableDictionary(IDictionary&lt;TKey, TVal&gt; dictionary) : base(dictionary) { } public SerializableDictionary(IEqualityComparer&lt;TKey&gt; comparer) : base(comparer) { } public SerializableDictionary(int capacity) : base(capacity) { } public SerializableDictionary(IDictionary&lt;TKey, TVal&gt; dictionary, IEqualityComparer&lt;TKey&gt; comparer) : base(dictionary, comparer) { } public SerializableDictionary(int capacity, IEqualityComparer&lt;TKey&gt; comparer) : base(capacity, comparer) { } #endregion #region ISerializable Members protected SerializableDictionary(SerializationInfo info, StreamingContext context) { int itemCount = info.GetInt32("ItemCount"); for (int i = 0; i &lt; itemCount; i++) { KeyValuePair&lt;TKey, TVal&gt; kvp = (KeyValuePair&lt;TKey, TVal&gt;)info.GetValue(String.Format("Item{0}", i), typeof(KeyValuePair&lt;TKey, TVal&gt;)); this.Add(kvp.Key, kvp.Value); } } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("ItemCount", this.Count); int itemIdx = 0; foreach (KeyValuePair&lt;TKey, TVal&gt; kvp in this) { info.AddValue(String.Format("Item{0}", itemIdx), kvp, typeof(KeyValuePair&lt;TKey, TVal&gt;)); itemIdx++; } } #endregion #region IXmlSerializable Members void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer) { //writer.WriteStartElement(DictionaryNodeName); foreach (KeyValuePair&lt;TKey, TVal&gt; kvp in this) { writer.WriteStartElement(ItemNodeName); writer.WriteStartElement(KeyNodeName); KeySerializer.Serialize(writer, kvp.Key); writer.WriteEndElement(); writer.WriteStartElement(ValueNodeName); ValueSerializer.Serialize(writer, kvp.Value); writer.WriteEndElement(); writer.WriteEndElement(); } //writer.WriteEndElement(); } void IXmlSerializable.ReadXml(System.Xml.XmlReader reader) { if (reader.IsEmptyElement) { return; } // Move past container if (!reader.Read()) { throw new XmlException("Error in Deserialization of Dictionary"); } //reader.ReadStartElement(DictionaryNodeName); while (reader.NodeType != XmlNodeType.EndElement) { reader.ReadStartElement(ItemNodeName); reader.ReadStartElement(KeyNodeName); TKey key = (TKey)KeySerializer.Deserialize(reader); reader.ReadEndElement(); reader.ReadStartElement(ValueNodeName); TVal value = (TVal)ValueSerializer.Deserialize(reader); reader.ReadEndElement(); reader.ReadEndElement(); this.Add(key, value); reader.MoveToContent(); } //reader.ReadEndElement(); reader.ReadEndElement(); // Read End Element to close Read of containing node } System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema() { return null; } #endregion #region Private Properties protected XmlSerializer ValueSerializer { get { if (valueSerializer == null) { valueSerializer = new XmlSerializer(typeof(TVal)); } return valueSerializer; } } private XmlSerializer KeySerializer { get { if (keySerializer == null) { keySerializer = new XmlSerializer(typeof(TKey)); } return keySerializer; } } #endregion #region Private Members private XmlSerializer keySerializer = null; private XmlSerializer valueSerializer = null; #endregion } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload