Does anyone know of a creative way to serialize objects that implement IDictionary? ...without implementing a new class?
NET objects is made easy by using the various serializer classes that it provides. But serialization of a Dictionary object is not that easy. For this, you have to create a special Dictionary class which is able to serialize itself. The serialization technique might be different in different business cases.
Unity cannot serialize standard dictionaries. This means that they won't show or be edited in the inspector and they won't be instantiated at startup. A classic workaround is to store the keys and values in separate arrays and construct the dictionary at startup.
KeyValuePair<> class, but it does not properly serialize in a web service. In a web service, the Key and Value properties are not serialized, making this class useless, unless someone knows a way to fix this.
If the class implementing IDictionary
is serializable (like Dictionary<K,V>
) and K
and V
are serializable then the standard .NET serialization mechanisms should work.
If the class implementing IDictionary
is serializable but K
and V
are then you could use two arrays to serialize the keys and associated values separately:
// before serialization
IDictionary<string,int> dict;
string[] keys = dict.Keys.ToArray();
int[] values = dict.Keys.Select(key => dict[key]).ToArray();
// after deserialization
IDictionary<string,int> dict = new Dictionary<string,int>();
for (int i = 0; i < keys.Length; i++)
dict.Add(keys[i], values[i]);
I take it you mean you have to serialize a dictionary that's part of class you have no control over?
In short, you have to serialize the keys and values separately. To deserialize, step through each item in the key/value arrays and add them back to your dictionary.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With