6.存储数据和读取数据

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

×

喜欢就点赞,疼爱就打赏