素材巴巴 > 程序开发 >

Untiy Json和Xml的序列化和反序列化

程序开发 2023-09-08 19:28:07

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;// 改变的需要的时间,默认设为1fpublic 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 zoomPoints;public List zoomPoints;
 }
 

3.序列化

// 写入数据
 public void WriteDataTest(){Data data = new(){zoomPoints = new List()};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(readDate);// 分配内存if(data == null ){data = new Data() {zoomPoints = new List()};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 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 nodes;
 }
 

效果:

请添加图片描述

请添加图片描述


Xml的序列化和反序列化

1.定义数据类

public class XmlText {public string name;public string value;public List 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()};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;}
 

结果:

请添加图片描述


标签:

上一篇: chrome调试12-调试javascript的流程 下一篇:
素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。