SerializableDictionary.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using System;
  4. using System.Linq;
  5. using System.Collections.Generic;
  6. namespace O3DWB
  7. {
  8. [Serializable]
  9. public class SerializableDictionary<SerializedKeyType, SerializedValueType>
  10. : ISerializationCallbackReceiver
  11. {
  12. #region Private Variables
  13. private Dictionary<SerializedKeyType, SerializedValueType> _dictionary = new Dictionary<SerializedKeyType, SerializedValueType>();
  14. [SerializeField]
  15. private List<SerializedKeyType> _serializedKeys = new List<SerializedKeyType>();
  16. [SerializeField]
  17. private List<SerializedValueType> _serializedValues = new List<SerializedValueType>();
  18. #endregion
  19. #region Public Properties
  20. public Dictionary<SerializedKeyType, SerializedValueType> Dictionary { get { return _dictionary; } }
  21. #endregion
  22. #region Public Methods
  23. public void OnBeforeSerialize()
  24. {
  25. RemoveNullKeys();
  26. _serializedKeys.Clear();
  27. _serializedValues.Clear();
  28. // Store the dictionary keys and values inside the serialized lists
  29. foreach (var keyValuePair in _dictionary)
  30. {
  31. _serializedKeys.Add(keyValuePair.Key);
  32. _serializedValues.Add(keyValuePair.Value);
  33. }
  34. }
  35. public void OnAfterDeserialize()
  36. {
  37. _dictionary = new Dictionary<SerializedKeyType, SerializedValueType>();
  38. // Use the serialized lists to populate the new dictionary
  39. int numberOfKeyValuePairs = Math.Min(_serializedKeys.Count, _serializedValues.Count);
  40. for (int keyValuePairIndex = 0; keyValuePairIndex < numberOfKeyValuePairs; keyValuePairIndex++)
  41. {
  42. _dictionary.Add(_serializedKeys[keyValuePairIndex], _serializedValues[keyValuePairIndex]);
  43. }
  44. _serializedKeys.Clear();
  45. _serializedValues.Clear();
  46. }
  47. public void RemoveNullKeys()
  48. {
  49. _dictionary = (from keyValuePair in _dictionary
  50. where !EqualityComparer<SerializedKeyType>.Default.Equals(keyValuePair.Key, default(SerializedKeyType))
  51. select keyValuePair).ToDictionary(keyValuePair => keyValuePair.Key, keyValuePair => keyValuePair.Value);
  52. }
  53. #endregion
  54. }
  55. }
  56. #endif