using System; using System.Collections.Generic; using UnityEngine; namespace VertexColor.ScenePartition { [Serializable] public class SerializableDictionary : Dictionary, ISerializationCallbackReceiver { [SerializeField] private List keys = new List(); [SerializeField] private List values = new List(); public void OnBeforeSerialize() { keys.Clear(); values.Clear(); foreach (KeyValuePair pair in this) { keys.Add(pair.Key); values.Add(pair.Value); } } public void OnAfterDeserialize() { Clear(); if (keys.Count != values.Count) { throw new Exception("Error: Key and value count does not match in the dictionary."); } for (int i = 0; i < keys.Count; i++) { Add(keys[i], values[i]); } } } [Serializable] public class SerializableSortedList : SortedList, ISerializationCallbackReceiver { [SerializeField] private List keys = new List(); [SerializeField] private List values = new List(); public void OnBeforeSerialize() { keys.Clear(); values.Clear(); foreach (KeyValuePair pair in this) { keys.Add(pair.Key); values.Add(pair.Value); } } public void OnAfterDeserialize() { Clear(); if (keys.Count != values.Count) { throw new Exception("Error: Key and value count does not match in the dictionary."); } for (int i = 0; i < keys.Count; i++) { Add(keys[i], values[i]); } } } [Serializable] public class SerializableSortedSet : SortedSet, ISerializationCallbackReceiver { [SerializeField] private List elements = new List(); public void OnBeforeSerialize() { elements.Clear(); elements.AddRange(this); } public void OnAfterDeserialize() { Clear(); for (int i = 0; i < elements.Count; i++) { Add(elements[i]); } } } }