6.Xml数据管理类存储数据和读取数据
6.1 知识点
实现存储逻辑
/// <summary>
/// 将数据对象序列化之后保存到xml格式文件中。
/// </summary>
/// <param name="data">要存储的数据对象</param>
/// <param name="fileName">指定存储的文件名。注意,不需要包括后缀".xml"。</param>
public void SaveData(object data, string fileName)
{
// 获取该数据类型存储XML文件的路径
string path = Application.persistentDataPath + "/" + fileName + ".xml";
using (StreamWriter streamWriter = new StreamWriter(path))
{
// 对数据进行序列化处理(使用 XML 序列化方式)
XmlSerializer xmlSerializer = new XmlSerializer(data.GetType());
xmlSerializer.Serialize(streamWriter, data);
}
}
实现读取逻辑
/// <summary>
/// 从指定的xml文件反序列化出对象实例并返回。
/// </summary>
/// <param name="type">指定反序列化得到的对象类型</param>
/// <param name="fileName">指定读取的文件名。注意,请不要包含后缀".xml"。</param>
/// <returns>返回反序列化得到的对象实例。</returns>
public object LoadData(Type type, string fileName)
{
// 获取该数据类型存储XML文件的路径
string path = Application.persistentDataPath + "/" + fileName + ".xml";
// 如果数据文件不存在,则不做任何处理,直接返回一个实例对象
if (!File.Exists(path))
{
// 尝试从默认读取路径中尝试读取文件。如果包含该文件,则尝试获取其信息并进行反序列化。
path = Application.streamingAssetsPath + "/" + fileName + ".xml";
if (!File.Exists(path))
{
// 不幸的是,即使在默认路径中也找不到该文件,因此我们将无法从XML文件中反序列化任何内容,所以要新建一个对象来返回。
return Activator.CreateInstance(type);
}
}
// 存在XML文件,于是我们创建文本读写器,将XML文件转换为对象并返回之。
using (StreamReader streamReader = new StreamReader(path))
{
XmlSerializer xmlSerializer = new XmlSerializer(type);
return xmlSerializer.Deserialize(streamReader);
}
}
测试Xml数据管理类
public class TestItem99
{
public int id = 1;
public int num = 10;
}
public class TestClass99
{
public int test1;
public string test2;
public TestItem99 item;
public TestItem99[] array;
public List<TestItem99> list;
public SerizlizerDictionary<int, TestItem99> dic;
}
public class XmlDataMgrTest : MonoBehaviour
{
void Start()
{
TestClass99 t99 = XmlDataMgr.Instance.LoadData(typeof(TestClass99), "Test99") as TestClass99;
Debug.Log($"t99.test1:{t99.test1} t99.test2:{t99.test2} t99.item:{t99.item} t99.array:{t99.array} t99.list:{t99.list} t99.dic:{t99.dic}");
t99 = new TestClass99();
t99.test1 = 1;
t99.test2 = "林文韬";
t99.item = new TestItem99();
t99.array = new TestItem99[2] { new TestItem99(), new TestItem99() };
t99.list = new List<TestItem99>() { new TestItem99() };
t99.dic = new SerizlizerDictionary<int, TestItem99>() { { 1, new TestItem99() }, { 2, new TestItem99() } };
XmlDataMgr.Instance.SaveData(t99, "Test99");
}
}
查看测试结果
查看路径下的xml文件
<?xml version="1.0" encoding="utf-8"?>
<TestClass99 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<test1>1</test1>
<test2>林文韬</test2>
<item>
<id>1</id>
<num>10</num>
</item>
<array>
<TestItem99>
<id>1</id>
<num>10</num>
</TestItem99>
<TestItem99>
<id>1</id>
<num>10</num>
</TestItem99>
</array>
<list>
<TestItem99>
<id>1</id>
<num>10</num>
</TestItem99>
</list>
<dic>
<int>1</int>
<TestItem99>
<id>1</id>
<num>10</num>
</TestItem99>
<int>2</int>
<TestItem99>
<id>1</id>
<num>10</num>
</TestItem99>
</dic>
</TestClass99>
查看测试读取存储的Log
6.2 知识点代码
XmlDataMgr
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
using UnityEngine;
//XML数据管理类
public class XmlDataMgr
{
// 单例模式,确保全局只会有一个XmlDataMgr对象
private static XmlDataMgr instance = new XmlDataMgr();
public static XmlDataMgr Instance => instance;
private XmlDataMgr() { }
/// <summary>
/// 将数据对象序列化之后保存到xml格式文件中。
/// </summary>
/// <param name="data">要存储的数据对象</param>
/// <param name="fileName">指定存储的文件名。注意,不需要包括后缀".xml"。</param>
public void SaveData(object data, string fileName)
{
// 获取该数据类型存储XML文件的路径
string path = Application.persistentDataPath + "/" + fileName + ".xml";
using (StreamWriter streamWriter = new StreamWriter(path))
{
// 对数据进行序列化处理(使用 XML 序列化方式)
XmlSerializer xmlSerializer = new XmlSerializer(data.GetType());
xmlSerializer.Serialize(streamWriter, data);
}
}
/// <summary>
/// 从指定的xml文件反序列化出对象实例并返回。
/// </summary>
/// <param name="type">指定反序列化得到的对象类型</param>
/// <param name="fileName">指定读取的文件名。注意,请不要包含后缀".xml"。</param>
/// <returns>返回反序列化得到的对象实例。</returns>
public object LoadData(Type type, string fileName)
{
// 获取该数据类型存储XML文件的路径
string path = Application.persistentDataPath + "/" + fileName + ".xml";
// 如果数据文件不存在,则不做任何处理,直接返回一个实例对象
if (!File.Exists(path))
{
// 尝试从默认读取路径中尝试读取文件。如果包含该文件,则尝试获取其信息并进行反序列化。
path = Application.streamingAssetsPath + "/" + fileName + ".xml";
if (!File.Exists(path))
{
// 不幸的是,即使在默认路径中也找不到该文件,因此我们将无法从XML文件中反序列化任何内容,所以要新建一个对象来返回。
return Activator.CreateInstance(type);
}
}
// 存在XML文件,于是我们创建文本读写器,将XML文件转换为对象并返回之。
using (StreamReader streamReader = new StreamReader(path))
{
XmlSerializer xmlSerializer = new XmlSerializer(type);
return xmlSerializer.Deserialize(streamReader);
}
}
}
TestClass99
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestItem99
{
public int id = 1;
public int num = 10;
}
public class TestClass99
{
public int test1;
public string test2;
public TestItem99 item;
public TestItem99[] array;
public List<TestItem99> list;
public SerizlizerDictionary<int, TestItem99> dic;
}
public class XmlDataMgrTest : MonoBehaviour
{
void Start()
{
TestClass99 t99 = XmlDataMgr.Instance.LoadData(typeof(TestClass99), "Test99") as TestClass99;
Debug.Log($"t99.test1:{t99.test1} t99.test2:{t99.test2} t99.item:{t99.item} t99.array:{t99.array} t99.list:{t99.list} t99.dic:{t99.dic}");
t99 = new TestClass99();
t99.test1 = 1;
t99.test2 = "林文韬";
t99.item = new TestItem99();
t99.array = new TestItem99[2] { new TestItem99(), new TestItem99() };
t99.list = new List<TestItem99>() { new TestItem99() };
t99.dic = new SerizlizerDictionary<int, TestItem99>() { { 1, new TestItem99() }, { 2, new TestItem99() } };
XmlDataMgr.Instance.SaveData(t99, "Test99");
}
}
Test99.xml
<?xml version="1.0" encoding="utf-8"?>
<TestClass99 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<test1>1</test1>
<test2>林文韬</test2>
<item>
<id>1</id>
<num>10</num>
</item>
<array>
<TestItem99>
<id>1</id>
<num>10</num>
</TestItem99>
<TestItem99>
<id>1</id>
<num>10</num>
</TestItem99>
</array>
<list>
<TestItem99>
<id>1</id>
<num>10</num>
</TestItem99>
</list>
<dic>
<int>1</int>
<TestItem99>
<id>1</id>
<num>10</num>
</TestItem99>
<int>2</int>
<TestItem99>
<id>1</id>
<num>10</num>
</TestItem99>
</dic>
</TestClass99>
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com