• 纯Unity环境下,把一个object系列化成json并保存到本地,然后读取json再次反系列化成object


    一、本文主要讨论:

    • 1、纯Unity环境下的系列化和反系列化
    • 2、把一个对象系列化成json对象,并保存到指定目录。object -> Json -> file.json
    • 3、读取一个json文件,并把它反系列化成指定的对象T。Read file.json -> object

    二、关键要点:

    • 系列化和反系列用到的组件
      系列化: JsonUtility.ToJson()
      反系列化:JsonUtility.FromJson< T >()

    系列化和反系列化时,Json文档的结构必须和一个预先定义的Class存在映射关系。

    • json文件的保存和读取
      保存为json:File.WriteAllText()
      读取json文件:File.ReadAllText()

    三、核心代码

    系列化code

        /// 
        /// 把一个对象系列化成json对象,并保存到指定目录
        /// 
        /// 要系列化的对象的类型
        /// 保存的路径:path + file Name
        /// 要系列化的对象
        /// is successful
        public static bool WriteObjToJsonFile<T>(string path,T obj)
        {
            var rtn = true;
            try
            {
                var jsonString = JsonUtility.ToJson(obj);
                File.WriteAllText(path, jsonString);
                Debug.Log("文件保存成功!");
            }
            catch(Exception ex)
            {
                Debug.Log($"WriteObjToJsonFile(..)系列化并保存对象的时候出错:{ex.ToString()}");
                rtn = false;
            }
    
            return rtn;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    反系列化code

    
        /// 
        /// 读取一个json文件,并把它反系列化成指定的对象T
        /// 
        /// 反系列化成什么数据类型
        /// json的文件目录
        /// 返回T类型的object
        public static T ReadJsonFileAsObject<T>(string path)
        {
            T rtn;
            try
            {
                var jsonString = File.ReadAllText(path);
                rtn = JsonUtility.FromJson<T>(jsonString);
            }
            catch(Exception ex){
                Debug.Log($"ReadJsonFileAsObject()读取json文件并反系列化的时候出错:{ex.ToString()}");
                rtn = default(T);
            }
            
            return rtn;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    四、测试

    • 环境:Win10 + Unity 2020.3.19 Editor
    • Unity中的数据对象
      (1)Class描述
    /// 
    /// 实验数据
    /// 
    [Serializable]
    public class SendData
    {
        [SerializeField]
        public string resproCode;  //资源标识
        [SerializeField]
        public string userName;    //用户名:如果同一台电脑登录了两个用户,需要用该字段来进行识别。
        [SerializeField]
        public int status;         //实验结果
        [SerializeField]
        public int score;          //实验成绩
        [SerializeField]
        public long startTime;     //实验开始时间
        [SerializeField]
        public long endTime;       //实验结束时间
        [SerializeField]
        public List<StepData> steps = new List<StepData>(); //试验步骤数据表
    }
    /// 
    /// 实验步骤
    /// 
    [Serializable]
    public class StepData
    {
        [SerializeField] 
        public int seq;             //实验步骤序号
        [SerializeField] 
        public string title;        //实验步骤名称
        [SerializeField] 
        public long startTime;      //实验步骤开始时间
        [SerializeField] 
        public long endTime;        //实验步骤结束时间
        [SerializeField] 
        public int expectTime;      //实验步骤合理用时
        [SerializeField] 
        public int maxScore;        //实验步骤满分
        [SerializeField] 
        public int score;           //实验步骤得分
        [SerializeField] 
        public int repeatCount;     //实验步骤操作次数
        [SerializeField] 
        public string evaluation;   //步骤评价
        [SerializeField] 
        public string scoringModel; //赋分模型
        [SerializeField] 
        public string remarks;      //备注
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    (2)在inspector上的展示
    在这里插入图片描述
    (3)系列化后保存的Json文件
    在这里插入图片描述

  • 相关阅读:
    文心一言 VS 讯飞星火 VS chatgpt (115)-- 算法导论10.2 8题
    Vue(二)——基本操作
    Spring的事务
    药师帮再冲刺上市:研发远低于营销,债务高企,张步镇为董事长
    PG FULL_PAGE_WRITES MYSQL DOUBLE WRITE LOG
    护肤品销售系统
    Linux学习之HTTP
    python-docx办公自动化批量生成离职证明
    微信的通讯录联系人,有没有什么办法导出来做备份
    pytorch直线拟合
  • 原文地址:https://blog.csdn.net/dzj2021/article/details/126837722