C#のListはいわゆる配列リストってやつで、C++でいうvector、JavaでいうArrayListに相当します。C#にもArrayListは存在しますが、古い機能のため非ジェネリックです。
※OnBeforeSerializeとOnAfterDeserializeを実装しますが、何故かOnBeforeSerializeに解説が集中しているのでそっちのリンクを掲載。
この場合、インスペクタを介したリアルタイムな編集はできませんが、永続化が目的ならばこれで十分でしょう。LinkedListやDictionaryをインスペクタで触れるようにするとむしろ怖い。
そんなこんなで、Unityで使用可能なC#のコレクションをISerializationCallbackReceiver実装クラスで一通りラップしてみたので、以下に公開します。
実装
ラップされたコレクションとほぼ同じインターフェースと機能を提供するように配慮しています。
SerializableCollection.cs
サンプル
ジェネリッククラスのままではシリアライズできないため、下記のように継承して使います。やや面倒ですが、辞書型はキーと値のペアとなる非ジェネリッククラスも指定してやる必要があります。
CollectionTest.cs
ログ出力は下記のようになりました。
IntLinkedList: {"_":[0,0,1,1,2,2,3,3,4,4]}
IntLinkedList: {"_":[0,0,1,1,2,2,3,3,4,4]}
IntQueue: {"_":[0,0,1,1,2,2,3,3,4,4]}
IntQueue: {"_":[0,0,1,1,2,2,3,3,4,4]}
IntStack: {"_":[4,4,3,3,2,2,1,1,0,0]}
IntStack: {"_":[4,4,3,3,2,2,1,1,0,0]}
IntHashSet: {"_":[0,1,2,3,4]}
IntHashSet: {"_":[0,1,2,3,4]}
IntStringDictionary: {"_":[{"k":0,"v":"0"},{"k":1,"v":"1"},{"k":2,"v":"2"},{"k":3,"v":"3"},{"k":4,"v":"4"},{"k":5,"v":"5"},{"k":6,"v":"6"},{"k":7,"v":"7"},{"k":8,"v":"8"},{"k":9,"v":"9"}]}
IntStringDictionary: {"_":[{"k":0,"v":"0"},{"k":1,"v":"1"},{"k":2,"v":"2"},{"k":3,"v":"3"},{"k":4,"v":"4"},{"k":5,"v":"5"},{"k":6,"v":"6"},{"k":7,"v":"7"},{"k":8,"v":"8"},{"k":9,"v":"9"}]}
IntStringSortedDictionary: {"_":[{"k":0,"v":"0"},{"k":1,"v":"1"},{"k":2,"v":"2"},{"k":3,"v":"3"},{"k":4,"v":"4"},{"k":5,"v":"5"},{"k":6,"v":"6"},{"k":7,"v":"7"},{"k":8,"v":"8"},{"k":9,"v":"9"}]}
IntStringSortedDictionary: {"_":[{"k":0,"v":"0"},{"k":1,"v":"1"},{"k":2,"v":"2"},{"k":3,"v":"3"},{"k":4,"v":"4"},{"k":5,"v":"5"},{"k":6,"v":"6"},{"k":7,"v":"7"},{"k":8,"v":"8"},{"k":9,"v":"9"}]}