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

数据存储效果:

Untiy Json和Xml的序列化和反序列化_第1张图片

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;

}

结果:

Untiy Json和Xml的序列化和反序列化_第2张图片

你可能感兴趣的:(json,xml)