1. 程式人生 > >Unity3d 實現物件的XML格式化和反序列化

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