Json的序列化和反序列化
1.定义数据类
[Serializable]
public class ZoomPoint
{
// 点名称, 将作为Key被字典存储
public string name;
// 轴心X坐标
public Vector2 pivot = Vector2.one / 2;
// 放大倍率,小于1是为缩小倍率,小于0是取绝对值,不允许原点对称缩放,需要保证计算轴心逻辑正确
// 默认设为1.5f 放大倍率
public float zoomMagnification = 5f;
// 改变的需要的时间,默认设为1f
public float time = 1.0f;
public override string ToString()
{
return $"name = {this.name}, pivot = ({pivot.ToString()}), zoomMagnification = {this.zoomMagnification}, time = {this.time}";
}
}
2. 定义Json存储类
// 数据存储接受类
[Serializable]
public class Data{
// public ZoomPoint[] zoomPoints;
// public Dictionary<string, ZoomPoint> zoomPoints;
public List<ZoomPoint> zoomPoints;
}
3.序列化
// 写入数据
public void WriteDataTest(){
Data data = new()
{
zoomPoints = new List<ZoomPoint>()
};
ZoomPoint point1 = new ZoomPoint
{
name = "1",
pivot = new Vector2(0.75f,0.75f)
};
ZoomPoint point2 = new ZoomPoint
{
name = "2",
pivot = new Vector2(0.5f,0.5f)
};
data.zoomPoints[0] = point1;
data.zoomPoints[1] = point2;
string js = JsonUtility.ToJson(data);
// 获取项目路径
string fileUrl;
if(filePath == ""){
fileUrl = Application.streamingAssetsPath + jsonFileName;
}else{
fileUrl = filePath;
}
using(StreamWriter sw = new StreamWriter(fileUrl))
{
sw.WriteLine(js); //保存数据
sw.Close();
sw.Dispose();
}
}
4.反序列化
public Data ReadData(){
// 获取文件路径
string fileUrl;
if(filePath == ""){
fileUrl = Application.streamingAssetsPath + jsonFileName;
}else{
fileUrl = filePath;
}
//读取文件
string readDate;
using (StreamReader sr = File.OpenText(fileUrl)){
readDate = sr.ReadLine();
sr.Close();
}
Data data = JsonUtility.FromJson<Data>(readDate);
// 分配内存
if(data == null ){
data = new Data() {
zoomPoints = new List<ZoomPoint>()
};
return data;
}
// 数据保存到字典里
foreach(ZoomPoint zp in data.zoomPoints){
dict.TryAdd(zp.name, zp);
}
return data;
}
数据存储效果:
Ps: Unity C# Json 序列化换行
在ToJson中使用两个参数,第二个参数PrettyPrint 输入True
private void JsonText() {
Node node = new Node() {
name = "Node_01",
pos = new(0, 0)
};
string filePath = Application.streamingAssetsPath + "/Json_01.json";
string str = JsonUtility.ToJson(node, true);
using (StreamWriter sw = new StreamWriter(filePath)) {
sw.WriteLine(str); // 保存数据
sw.Close(); // 关闭文档
sw.Dispose();
}
Debug.Log(str);
Grid grid = new() {
nodes = new List<Node>()
};
Node node1 = new Node() {
name = "Node_01",
pos = new Vector2(0, 0)
};
Node node2 = new Node() {
name = "Node_02",
pos = new Vector2(0,1)
};
grid.nodes.Add(node1);
grid.nodes.Add(node2);
string filePath_01 = Application.streamingAssetsPath + "/Json_02.json";
string str_01 = JsonUtility.ToJson(grid, true);
using (StreamWriter sw = new StreamWriter(filePath_01)) {
sw.WriteLine(str_01); // 保存数据
sw.Close(); // 关闭文档
sw.Dispose();
}
Debug.Log("数据序列化完成");
}
[Serializable]
public class Node {
public string name;
public Vector2 pos;
}
[Serializable]
public class Grid {
public List<Node> nodes;
}
效果:
Xml的序列化和反序列化
1.定义数据类
public class XmlText {
public string name;
public string value;
public List<int> list;
public override string ToString() {
return $"name = {name}, value = {value}, list = {list}";
}
}
2.序列化
public void Init() {
test = new XmlText() {
name = "Xml测试",
value = "value",
list = new List<int>()
};
test.list.Add(1);
test.list.Add(3);
test.list.Add(100);
}
// 序列化Xml
public void XmlSerialize() {
// 定义流文件
FileStream fileStream = new FileStream(Application.streamingAssetsPath + "/text.xml",FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
// 定义写入流
StreamWriter sw = new StreamWriter(fileStream, System.Text.Encoding.UTF8);
// 位于System.Xml.Serialization 中的Xml序列化
XmlSerializer xml = new XmlSerializer(test.GetType());
// 将类序列化写入流中
xml.Serialize(sw, test);
// 关闭流
sw.Close();
fileStream.Close();
}
3.反序列化
public XmlText Deserialize() {
// 流文件
FileStream fs = new FileStream(Application.streamingAssetsPath + "/text.xml", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
// 定义序列化类
XmlSerializer xml = new XmlSerializer(typeof(XmlText));
// 反向序列化
XmlText result = (XmlText)xml.Deserialize(fs);
fs.Close();
return result;
}