Json数据持久化-Newtonsoft补充

75 阅读2分钟

在Json数据持久化过程中,Newtonsoft序列化和反序列化过程中,可以不携带对象名,也可以实现对象的序列化和反序列化。

实体类代码修改如下:

/*
 JSON是一种轻量级的数据交换和存储格式

可以用于对数据的设备(如手机的本地存储)和向Web服务器上传,并且符合面向对象编程的思想

JSON采用完全独立于语言的文本格式,但也使用了类似于C语言家族的习惯(包括C,C++,C#,JAVA等)

这些特性使JSON成为理想的数据交换语言,易于人阅读和编写,同时也易于机器解析和生成

可以使用NewtonJson来进行序列化。

假设有一个数据存档类,包含版本号、金币数量、体力、主武器、上下炮台、字典测试
 */
//添加可序列化标志
[System.Serializable]
public class PlayerSaveData
{
    // 版本号 
    public string versionId;
    // 金币数量
    public int gold;
    // 体力 
    public int energy;
    // 主武器 
    public int mainWeapon;
    // 上炮台  
    public int towerUp;
    // 下炮台
    public int towerDown;
    public override string ToString()
    {
        return string.Format("gold:{0},versionId:{1}",gold,versionId);
    }
}

对象序列化代码如下:

using Newtonsoft.Json;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;

//通过使用NewtonJson序列化并输出,且NewtonJson还可以将字典序列化
public class SerialezeField : MonoBehaviour
{
    //数据
    PlayerSaveData data = new PlayerSaveData()
    {
        versionId = "0.03",
        gold = 1000,
        energy = 1000,
        mainWeapon = 20000,
        towerUp = 40000,
        towerDown = 40000,
    };
    PlayerSaveData data1 = new PlayerSaveData()
    {
        versionId = "0.04",
        gold = 2000,
        energy = 2000,
        mainWeapon = 40000,
        towerUp = 80000,
        towerDown = 80000,
    };
    List<PlayerSaveData> datas = new List<PlayerSaveData>();
    private void Awake()
    {
         datas.Add(data);
         datas.Add(data1);
         SaveDatasJsonByNewtonsoft();
        ReadDatasJsonByNewtonsoft();
    }
  
    //对象序列化
    private void SaveDatasJsonByNewtonsoft()
    {
       
        //方式1:使用Newtonsoft.Json序列化数据
        string json = JsonConvert.SerializeObject(datas);
        //根据文件路径,创建/打开目标文件,使用到I/O;
        StreamWriter writer = new StreamWriter(DataManager.Instance.GetPlayerDataPath());
        //将json数据写入文件中
        writer.WriteLine(json);
        //关闭数据流
        writer.Close();
        Debug.Log("使用Newtonsoft存储数据完毕");
    }

    //对象的反序列化
    private void ReadDatasJsonByNewtonsoft()
    {
        if (!File.Exists(DataManager.Instance.GetPlayerDataPath()))
        {
            Debug.Log("找不到存档文件");
        }
        else
        {
           
            //根据文件路径创建数据流
            StreamReader reader = new StreamReader(DataManager.Instance.GetPlayerDataPath());
            //读取json数据
            string json = reader.ReadToEnd();
            //关闭数据流
            reader.Close();
            //将获取到的Json数据转为Datas类数据,使用NewTonsoft.Json,反序列化数据
             datas=JsonConvert.DeserializeObject<List<PlayerSaveData>>(json);
            foreach (var item in datas)
            {

                Debug.Log(item.ToString());
            }
            //把读取的数据赋值给目标对象
            // Debug.LogError(saveData.versionId);
            Debug.Log("本地存档读取赋值成功");
        }
    } 
}

json文件路径管理代码如下:

public class DataManager : SingletonTest<DataManager>
{
    //玩家数据存档路径
    private string playerDataPath = Application.streamingAssetsPath + "/PlayerSaveDatas.json";
    public string GetPlayerDataPath()
    { 
        return playerDataPath;
    }
}

json工具单例实现代码:

public class SingletonTest<T> : MonoBehaviour
    where T : Component
{
    private static volatile T _instance;

    //设置静态锁
    private static object _instanceLock = new object();
    public static T Instance
    {
        get
        {
            if (_instance == null)
            {

                _instance = FindObjectOfType(typeof(T)) as T;
                lock (_instanceLock)
                {
                    if (_instance == null)
                    {
                        GameObject obj = new GameObject();
                        //隐藏实例化的对象
                        obj.hideFlags = HideFlags.HideAndDontSave;
                        _instance = obj.AddComponent<T>();

                    }
                }
            }
            return _instance;
        }
    }
}