locked
SerializableDictionary RRS feed

  • Question

  • User-1741990555 posted

    using System;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p>

    using System.Collections.Generic;<o:p></o:p>

    using System.Runtime.Serialization;<o:p></o:p>

    <o:p> </o:p>

    // DESCRIPTION: Simple workaround for a lack of serialization capability in IDictionary objects<o:p></o:p>

    // Before:  Dictionary<string, string> d; d["key"] = "value";<o:p></o:p>

    // After:   SDictionary<string, string> d; d.target["key"] = "value";<o:p></o:p>

    // Dictionary is converted to a List of key value paris prior to serialization.<o:p></o:p>

    // NOTES: A ~100% memory usage overhead is due to storing the dictionary in a temporary generic collection<o:p></o:p>

    <o:p> </o:p>

    namespace Variatron<o:p></o:p>

    {<o:p></o:p>

          [Serializable]<o:p></o:p>

          public class SerializableDictionary<TKey, TValue><o:p></o:p>

          {<o:p></o:p>

                [NonSerialized]<o:p></o:p>

                public Dictionary<TKey, TValue> target = new Dictionary<TKey, TValue>();<o:p></o:p>

    <o:p> </o:p>

                [Serializable]<o:p></o:p>

                private class SerializedItem<o:p></o:p>

                {<o:p></o:p>

                      public TKey key;<o:p></o:p>

                      public TValue value;<o:p></o:p>

                }<o:p></o:p>

    <o:p> </o:p>

                private List<SerializedItem> data;<o:p></o:p>

    <o:p> </o:p>

                public SerializableDictionary()<o:p></o:p>

                      : base()<o:p></o:p>

                {<o:p></o:p>

                }<o:p></o:p>

    <o:p> </o:p>

                [OnSerializing]<o:p></o:p>

                internal void OnSerializing(StreamingContext context)<o:p></o:p>

                {<o:p></o:p>

                      data = new List<SerializedItem>();<o:p></o:p>

    <o:p> </o:p>

                      foreach (KeyValuePair<TKey, TValue> item in target)<o:p></o:p>

                      {<o:p></o:p>

                            SerializedItem si = new SerializedItem();<o:p></o:p>

                            si.key = item.Key;<o:p></o:p>

                            si.value = item.Value;<o:p></o:p>

                            data.Add(si);<o:p></o:p>

                      }<o:p></o:p>

                }<o:p></o:p>

                [OnDeserialized]<o:p></o:p>

                internal void OnDeserialized(StreamingContext context)<o:p></o:p>

                {<o:p></o:p>

                      target = new Dictionary<TKey, TValue>();<o:p></o:p>

                      foreach (SerializedItem si in data)<o:p></o:p>

                      {<o:p></o:p>

                            target.Add(si.key, si.value);<o:p></o:p>

                      }<o:p></o:p>

                      data = null;<o:p></o:p>

                }<o:p></o:p>

          }<o:p></o:p>

    }<o:p></o:p>

    <o:p> </o:p>

     

    Friday, March 3, 2006 7:08 AM

All replies

  • User-1741990555 posted

    SDictionary

    In my previous post should read:

    SerializableDictionary

    Friday, March 3, 2006 10:02 AM
  • User-319574463 posted
    Have you written any unit test code to exercise the function directly (rather than it being invoked indirectly)?
    Friday, October 27, 2006 4:48 AM