zoukankan      html  css  js  c++  java
  • Json JsonUtility对字典/列表的序列化,反序列化

    Unity5.3从开始追加的JsonUtility,但是对于List 和Dictionary不能被直接序列化存储.

    例如: 

    数据模型:

    using UnityEngine;  
    using System;  
    using System.Collections.Generic;  
      
    [Serializable]  
    public class Enemy  
    {  
        [SerializeField]  
        string name;  
        [SerializeField]  
        List<string> skills;  
      
        public Enemy(string name, List<string> skills)  
        {  
            this.name = name;  
            this.skills = skills;  
        }  
    }  

    实际使用:

    List<Enemy> enemies = new List<Enemy>();  
    enemies.Add(new Enemy("怪物1", new List<string>() { "攻击" }));  
    enemies.Add(new Enemy("怪物2", new List<string>() { "攻击", "恢复" }));  
    Debug.Log(JsonUtility.ToJson(enemies));  

    输出为:{}

    输出是没有任何的json字符串。

    ------------------------------------------------------------------------------------------------

    在unity的官方网站,ISerializationCallbackReceiver继承的方法被提出,用的时候把此脚本放到项目里.

    // Serialization.cs
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using System;
    
    // List<T>
    [Serializable]
    public class Serialization<T>
    {
        [SerializeField]
        List<T> target;
        public List<T> ToList() { return target; }
    
        public Serialization(List<T> target)
        {
            this.target = target;
        }
    }
    
    // Dictionary<TKey, TValue>
    [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)
        {
            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]);
            }
        }
    }

    使用:

    // List<T> -> Json ( 例 : List<Enemy> )  
    string str = JsonUtility.ToJson(new Serialization<Enemy>(enemies)); // 输出 : {"target":[{"name":"怪物1,"skills":["攻击"]},{"name":"怪物2","skills":["攻击","恢复"]}]}  
    // Json-> List<T>  
    List<Enemy> enemies = JsonUtility.FromJson<Serialization<Enemy>>(str).ToList();  
      
    // Dictionary<TKey,TValue> -> Json( 例 : Dictionary<int, Enemy> )  
    string str = JsonUtility.ToJson(new Serialization<int, Enemy>(enemies)); // 输出 : {"keys":[1000,2000],"values":[{"name":"怪物1","skills":["攻击"]},{"name":"怪物2","skills":["攻击","恢复"]}]}  
    // Json -> Dictionary<TKey,TValue>  
    Dictionary<int, Enemy> enemies = JsonUtility.FromJson<Serialization<int, Enemy>>(str).ToDictionary();  
  • 相关阅读:
    如何吸引小白用户爱上你的游戏?
    产品经理应聘之感受漫谈
    罗永浩Vs王自如:浮躁的世界该如何降温?!
    从锤子手机谈产品的逼格
    博客园与51CTO博客之产品用户体验分析
    web网站 Vs 移动App 谁更能打动你?之 产品经理篇
    不要只甘于做一个程序员
    我的程序员工作经历(二) 之 谈合作
    OpenCV 之 神经网络 (一)
    Qt 之 QtConcurrent
  • 原文地址:https://www.cnblogs.com/Peng18233754457/p/8798731.html
Copyright © 2011-2022 走看看