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.序列

引用

using System.Io;
using System.Xml.Serialization;
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;

}

结果:

请添加图片描述

原文地址:https://blog.csdn.net/blastospore/article/details/132214345

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_14277.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注