Unity3d 实现对象的XML格式化和反序列化

  但是网页平台不支持(如果数据库放在服务端,就没有这个问题了), 所以想到用XML格式来存储数据,数据量也不大,操作也简单,可以直接将对象存为xml文件,而且玩家本地存档也会用到。
 
   
 
   

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
//添加两个包
using System.Xml.Serialization;
using System.IO;

public class ttt
{
    [XmlAttribute]
    public string id;
    public ttt() { }
    public ttt(string s) { id = s; }
}
 
[SerializeField]//必须设置这个,要不然不能进行序列化
public class baseData
{
    public string id;
    [XmlAttribute]//设置为属性,而不是node
    public int level;
    public float exp;
    [XmlIgnore]//XmlIgnore 序列化中忽略掉
    public string testIgnore = "ssdf";
    //get set设置的方式也可以进行序列化, 但是私有的不行
    private int _seddd = 10;
    public int seddd
    {
        get { return _seddd; }
        set { _seddd = value; }
    }
    //可以设置数组结点和子结点的名字,如果不设置则为变量名和类型名字
    [XmlArray("items"), XmlArrayItem("item")]
    public ttt[] sss;
    //支持list
    public List aaa;
}
 

public class testXMLSave : MonoBehaviour
{
    //编辑器中跟目录是项目的目录, 如果要在运行中进行存档或修改的操作,要使用别的路劲
    const string xmlPath = "Assets/booktest.xml";
    void Start ()
    {
        //创建一个basedata对象
        baseData data = new baseData();
        data.id = "123455";
        data.level = 20;
        data.exp = 15.5f;
        data.sss = new ttt[3];
        data.sss[0] = new ttt();
        data.sss[0].id = "aaa2";
        data.sss[1] = new ttt();
        data.sss[1].id = "aaa1";
        data.aaa = new List();
        data.aaa.Add(new ttt("10"));
        data.aaa.Add(new ttt("20"));
        //序列化为XML文件
        XMLSerialize(data);
  }
 
    void XMLSerialize(baseData data)
    {
        //写入的路径
        TextWriter writer = new StreamWriter(xmlPath);
        XmlSerializer obj = new XmlSerializer(typeof(baseData));
        obj.Serialize(writer, data);
        writer.Close();
        Debug.Log("dfdfsdf");
    }
    //将XML格式的文件反序列化为对象
    void XMLDeserialize()
    {
        //读取xml
        TextReader writer = new StreamReader(xmlPath);
        XmlSerializer obj = new XmlSerializer(typeof(baseData));
        baseData data = obj.Deserialize(writer) as baseData;
        writer.Close();
        Debug.Log("load done:" + data.id);
    }
    void OnGUI()
    {
        //点击进行反序列化
        if (GUILayout.Button("Deserialize"))
        {
            XMLDeserialize();
        }
    }
}



将上面的代码绑定到场景里的任意对象上,执行后就会生成一个booktest.xml文件,并且点击Deserialize按钮后打印出了data.id的信息。说明已经成功将XML文件反序列化为对象了(不放心的话可以打断点查看对象数据)。

 

 
   



  123455
  15.5
 
   
   
 

 
   
   
 

  10
 


你可能感兴趣的:(Unity3d)