在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;
}
}
}