XmlDataManager类:提供xml公共的序列化和反序列化方法给外部,方便外部存储和获取数据。
SaveData方法:存储数据(对象,文件名)
ReadData方法:读取数据(类型,文件名)
切记:XmlSerializer类不支持对Dictionary的序列化与反序列化,如果类的成员中有字典,则需要自己实现可序列化的字典(我的上一篇文章已经实现,可以直接使用:支持xml序列化和反序列化的字典
using System;
using System.IO;
using System.Xml.Serialization;
using UnityEngine;
public class XmlDataManager
{
//单例模式
private static XmlDataManager instance = new XmlDataManager();
public static XmlDataManager Instance => instance;
private XmlDataManager()
{
}
//参数1:对象
//参数2:文件名
public void SaveData(object data, string fileName)
{
//1.得到存储路径 此路径可读可写
string path=Application.persistentDataPath+"/" + fileName;
//2.存储文件
using (StreamWriter sw = new StreamWriter(path))
{
//3.序列化
XmlSerializer xs = new XmlSerializer(data.GetType());
xs.Serialize(sw, data);
}
}
//参数1:数据类型
//参数2:文件名
public object ReadData(Type type,string fileName)
{
//1.得到存储路径 此路径可读可写
string path = Application.persistentDataPath + "/" + fileName;
//2.判断文件是否存在
if (File.Exists(path))
{
//3.存储文件
using (StreamReader sr = new StreamReader(path))
{
XmlSerializer xs = new XmlSerializer(type);
//将反序列化的对象直接返回 外部通过里氏替换 就能使用
return xs.Deserialize(sr);
}
}
return null;
}
}
测试:
using System.Collections.Generic;
using UnityEngine;
public class TestMgr
{
public int age;
public string name;
public List<int> list;
//注意:此处若想字典实现序列化与反序列化,就必须使用我前面实现的可序列化字典,否则报错。
public SerializerDictionay<int, string> dic;
public TestMgr()
{
age = 10;
name = "张三";
list = new List<int>();
dic = new SerializerDictionay<int, string>();
}
}
public class MgrTest : MonoBehaviour
{
void Start()
{
//序列化
TestMgr test = new TestMgr();
//增加元素
test.list.Add(100);
test.list.Add(200);
test.list.Add(300);
test.dic.Add(1, "111");
test.dic.Add(2, "222");
test.dic.Add(3, "333");
XmlDataManager.Instance.SaveData(test, "XmlDataManager.xml");
//反序列化(返回类型为object,注意里氏替换)
TestMgr test2 = XmlDataManager.Instance.ReadData(typeof(TestMgr), "XmlDataManager.xml") as TestMgr;
//打印信息
foreach (int item in test.list)
{
print(item);
}
foreach (KeyValuePair<int,string> kv in test.dic)
{
print(string.Format("key:{0},value:{1} ", kv.Key, kv.Value));
}
}
}
序列化文件截图:
反序列化输出截图(只输出了SerializerDictionay和list中的数据):