본문 바로가기
개발/Unity

Unity) Serialize Dictionary (Dictionary 직렬화)

by 테샤르 2022. 7. 3.

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 : [링크]

 

Unity - Scripting API: ISerializationCallbackReceiver

Unity's serializer is able to serialize most datatypes, but not all of them. In these cases, there are two callbacks available for you to manually process these datatypes so that Unity can serialize and deserialise them. Care needs to be taken whilst withi

docs.unity3d.com

 

★☆☆☆☆

 

반응형

댓글