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

来源:互联网 发布:java商城项目 编辑:程序博客网 时间:2024/06/06 00:04
  一般储存怪的数据的时候,都会想到数据库,操作数据库需要导入dll文件,手机平台能够支持, 但是网页平台不支持(如果数据库放在服务端,就没有这个问题了), 所以想到用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<ttt> 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<ttt>();
        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文件反序列化为对象了(不放心的话可以打断点查看对象数据)。

 

<?xml version="1.0" encoding="utf-8"?>
<baseData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" level="20">
  <id>123455</id>
  <exp>15.5</exp>
  <items>
    <item id="aaa2" />
    <item id="aaa1" />
  </items>
  <aaa>
    <ttt id="10" />
    <ttt id="20" />
  </aaa>
  <seddd>10</seddd>
</baseData> 


0 0