記事団結 - 公式シリアルインタフェースISerializationCallbackReceiver

 

簡単な紹介

団結では、人々は頭痛を叫んで、シリアライズは公式サポート多くの種類にもかかわらず、非常に面倒な問題となっていたが、そのような辞書として、いくつかのカスタムおよび一般的なタイプは、シリアライズすることはできません。幸い、ISerializationCallbackReceiverは、この問題を解決するために表示されます。

公式が提供するソリューション

コールバックの2種類を書き込むことによって、クラス継承ISerializationCallbackReceiverインタフェースを書く一覧を聞かせて代わりにシリアライズ辞書に参加

using UnityEngine;
using System;
using System.Collections.Generic;

public class SerializationCallbackScript : MonoBehaviour, ISerializationCallbackReceiver
{
    public List<int> _keys = new List<int> { 3, 4, 5 };
    public List<string> _values = new List<string> { "I", "Love", "Unity" };

    //Unity doesn't know how to serialize a Dictionary
    public Dictionary<int, string>  _myDictionary = new Dictionary<int, string>();

    public void OnBeforeSerialize()
    {
        _keys.Clear();
        _values.Clear();

        foreach (var kvp in _myDictionary)
        {
            _keys.Add(kvp.Key);
            _values.Add(kvp.Value);
        }
    }

    public void OnAfterDeserialize()
    {
        _myDictionary = new Dictionary<int, string>();

        for (int i = 0; i != Math.Min(_keys.Count, _values.Count); i++)
            _myDictionary.Add(_keys[i], _values[i]);
    }

    void OnGUI()
    {
        foreach (var kvp in _myDictionary)
            GUILayout.Label("Key: " + kvp.Key + " value: " + kvp.Value);
    }
}
  • 直列化された辞書の一般的なソリューション

しかし、我々はあまりにも頻繁に統一辞書で使用し、それは各クラス継承書き込みコールバック・インターフェース、人々はこの問題を解決するために私たちのためにジェネリックプログラミングを使用した牛は不可能です

public class SerializationDictionary<TKey, TValue> : ISerializationCallbackReceiver
{
    [SerializeField]
    private List<TKey> keys;
    [SerializeField]
    private List<TValue> values;

    private Dictionary<TKey, TValue> target;
    public Dictionary<TKey, TValue> ToDictionary() { return target; }

    public SerializationDictionary(Dictionary<TKey, TValue> target)
    {
        this.target = target;
    }

    public void OnBeforeSerialize()
    {
        keys = new List<TKey>(target.Keys);
        values = new List<TValue>(target.Values);
    }

    public void OnAfterDeserialize()
    {
        var count = Math.Min(keys.Count, values.Count);
        target = new Dictionary<TKey, TValue>(count);
        for (var i = 0; i < count; ++i)
        {
            target.Add(keys[i], values[i]);
        }
    }
}
  •  
  • 一般的な、あまりにも魅力的、と私は怠惰な、などとなります
リリース6元記事 ウォン称賛43 ビュー570 000 +

おすすめ

転載: blog.csdn.net/hany3000/article/details/104079863