Serialize Dictionary (Dictionary 직렬화)
Dictionary 를 직렬화 하게되면 Insepctor에서도 해당 값을 확인이 가능하다.
반응형
시리얼라이즈된 Key, Value 형태의 커스텀 클래스이다.
ISerializationCallbackReceiver 를 상속받아서
OnAfterDeserialize와 OnBeforeSerialize를 통해서 직렬화 처리를 하게 되어있다.
< 코드 >
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Serialization<TKey, TValue> : ISerializationCallbackReceiver
{
[SerializeField]
List<TKey> keys;
[SerializeField]
List<TValue> values;
Dictionary<TKey, TValue> target;
public Dictionary<TKey, TValue> ToDictionary()
{
return target;
}
public Serialization(Dictionary<TKey, TValue> _target)
{
target = _target;
}
public Serialization()
{
target = new Dictionary<TKey, TValue>();
}
public void OnBeforeSerialize()
{
keys = new List<TKey>(target.Keys);
values = new List<TValue>(target.Values);
}
public void OnAfterDeserialize()
{
var count = Mathf.Min(keys.Count, values.Count);
target = new Dictionary<TKey, TValue>(count);
for (var i = 0; i < count; ++i)
{
target.Add(keys[i], values[i]);
}
}
public void Add(TKey _key, TValue _value)
{
target.Add(_key, _value);
}
public void Remove(TKey _key)
{
target.Remove(_key);
}
public bool ContainsKey(TKey _key)
{
return target.ContainsKey(_key);
}
public bool ContainValue(TValue _value)
{
return target.ContainsValue(_value);
}
public bool TryGetValue(TKey _key, out TValue _value)
{
return target.TryGetValue(_key, out _value);
}
public TValue GetValue(TKey _key)
{
var enumurator = target.GetEnumerator();
while (enumurator.MoveNext())
{
if (enumurator.Current.Key.Equals(_key))
return enumurator.Current.Value;
}
throw new ArgumentException("No value was found for the given key");
}
public TValue GetValue(TValue _value)
{
var enumurator = target.GetEnumerator();
while (enumurator.MoveNext())
{
if (enumurator.Current.Value.Equals(_value))
return enumurator.Current.Value;
}
throw new ArgumentException("No value was found for the given key");
}
public (TKey,TValue) GetKeyValue(TValue _value)
{
var enumurator = target.GetEnumerator();
while (enumurator.MoveNext())
{
if (enumurator.Current.Value.Equals(_value))
return (enumurator.Current.Key,enumurator.Current.Value);
}
throw new ArgumentException("No value was found for the given key");
}
public IEnumerator GetEnumerator()
{
return target.GetEnumerator();
}
}
반응형
본인은 Key Value의 형태인 데이터를 좀더 수월하게 사용하기 위해서 사용했다.
기본적으로 Unity 에서는 대부분 데이터를 직렬화가 가능하지만 전부는 아니다.
Unity 에서 직렬화를 하려면 해당 인터페이스를 사용해야한다.
이 인터페이스는 Class에서만 작동한다.
Unity SerializeationCallbackReceiver : [링크]
★☆☆☆☆
반응형
댓글