自定义XML数据管理类:提供xml公共的序列化和反序列化方法给外部,方便外部存储和获取数据

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中的数据):
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值