Unity3d 實現物件的XML格式化和反序列化
阿新 • • 發佈:2019-01-28
但是網頁平臺不支援(如果資料庫放在服務端,就沒有這個問題了), 所以想到用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>