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

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",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, FileShare.ReadWrite);
    // 定义序列化类
    XmlSerializer xml = new XmlSerializer(typeof(XmlText));
    // 反向序列化
    XmlText result = (XmlText)xml.Deserialize(fs);
    fs.Close();

    return result;

}

结果:

请添加图片描述

相关文章

文章浏览阅读2.4k次。最近要优化cesium里的热力图效果,浏览...
文章浏览阅读1.2w次,点赞3次,收藏19次。在 Python中读取 j...
文章浏览阅读1.4k次。首字母缩略词 API 代表应用程序编程接口...
文章浏览阅读802次,点赞10次,收藏10次。解决一个JSON反序列...
文章浏览阅读882次。Unity Json和Xml的序列化和反序列化_uni...