Unity3D数据持久化方式二:XML

文章脚本来源于《Unity3D游戏开发从0到1》使用LevelData.cs和LevelDataInfos.cs脚本用来表示关卡类和关卡信息类;XmlOperation.cs为XML核心操作类,使用单例模式包含序列化与反序列方法和创建xml文件和读取xml文件方法等。最后TestXMlL用来测试。

public class LevelData
{
    public int levelNumber;                 //关卡编号
    public string levelName;                //关卡名字
    public bool isUnlock;                   //是否解锁
    public LevelDataInfo levelDataInfos;    //关卡详细要求

    public LevelData() { }
    public LevelData(int levelNumber, string levelName, bool isUnlock, LevelDataInfo levelDataInfos)
    {
        this.levelNumber = levelNumber;
        this.levelName = levelName;
        this.isUnlock = isUnlock;
        this.levelDataInfos = levelDataInfos;
    }
}
public class LevelDataInfo
{
    public string demandOfPass;    //通关要求
    public string detailContent;   //详细内容

    public LevelDataInfo() { }
    public LevelDataInfo(string demandOfPass, string detailContent)
    {
        this.demandOfPass = demandOfPass;
        this.detailContent = detailContent;
    }
}
using System;
using System.IO;
using System.Xml;
using System.Text;
using System.Xml.Serialization;
using System.Security.Cryptography;

public class XmlOperation
{
    //单例
    private static XmlOperation _Instance = null;
    public static XmlOperation GetInstance()
    {
        if(_Instance == null)
        {
            _Instance = new XmlOperation();
        }
        return _Instance;
    }

    //加密方法
    public string Encrypt(string toE)
    {
        //加密数据
        byte[] toEncryptArray = Encoding.UTF8.GetBytes(toE);
        //秘钥
        byte[] keyArray = Encoding.UTF8.GetBytes("12345678901234561234567890123456");
        //AES算法加密
        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = keyArray;
        rDel.Mode = CipherMode.ECB;
        rDel.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = rDel.CreateEncryptor();
        //加密
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
        return Convert.ToBase64String(resultArray,0,resultArray.Length);
    }
    //解密方法
    public string Decrypt(string toD)
    {
        //解密数据
        byte[] toDecryptArray = Convert.FromBase64String(toD);
        //秘钥
        byte[] keyArray = Encoding.UTF8.GetBytes("12345678901234561234567890123456");
        //AES算法加密
        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = keyArray;
        rDel.Mode = CipherMode.ECB;
        rDel.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = rDel.CreateDecryptor();
        //加密
        byte[] resultArray = cTransform.TransformFinalBlock(toDecryptArray, 0, toDecryptArray.Length);
        return Encoding.UTF8.GetString(resultArray);
    }

    //序列化对象
    public string SerializeObject(object pObject, System.Type ty)
    {
        string xmlizedString = null;
        MemoryStream memoryStream = new MemoryStream();
        XmlSerializer xs = new XmlSerializer(ty);
        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
        xs.Serialize(xmlTextWriter, pObject);
        memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
        xmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());
        return xmlizedString;
    }
    //反序列化对象
    public object DeserializeObject(string pXmlizedString, System.Type ty)
    {
        XmlSerializer xs = new XmlSerializer(ty);
        MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString));
        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream,Encoding.UTF8);
        return xs.Deserialize(memoryStream);
    }

    //创建XML文件
    public void CreatXML(string fileName, string strFileData)
    {
        StreamWriter writer;                               //写文件流
        //string strWriterFileData = Encrypt(strFileData);   //加密处理写入的文件流
        string strWriterFileData = strFileData;
        writer = File.CreateText(fileName);                
        writer.Write(strWriterFileData);                
        writer.Close();                                    //关闭文件流
    }
    //读取XML文件
    public string LoadXML(string fileName)
    {
        StreamReader sReader;                              //读文件流
        string dataString;                                 //读取的文件字符串
   
        sReader = File.OpenText(fileName);
        dataString = sReader.ReadToEnd();
        sReader.Close();                                   //关闭文件流
        //return Decrypt(dataString);                        //解密处理
        return dataString;
    }

    //是否存在文件
    public bool hasFile(String fileName)
    {
        return File.Exists(fileName);
    }
    //UTF8字节数组转字符串
    public byte[] StringToUTF8ByteArray(string pXmlizedString)
    {
        return Encoding.UTF8.GetBytes(pXmlizedString);
    }
    //UTF8字节数组转字符串
    public string UTF8ByteArrayToString(byte[] characters)
    {
        return Encoding.UTF8.GetString(characters);
    }
}
using UnityEngine;
using System.Collections.Generic;

public class TestXML : MonoBehaviour
{
    //数据关卡集合
    public List<LevelData> listLevelData = new List<LevelData>();
    //数据持久化路径
    private string _fileName; 
	
	void Start ()
    {
        _fileName = Application.persistentDataPath + "/UnityProjectLevelData";
        TestCase();            //建立测试用例
        StoreDataToXMLFile();  //存储对象到XML
        ReadDataFromXMLFile(); //读取测试
	}
    //定义初始化测试用例数据
    private void TestCase()
    {
        LevelDataInfo levelDataInfo0 = new LevelDataInfo("获取物品泰迪熊","在3分钟之内完成关卡目标,血量不低于0");
        LevelDataInfo levelDataInfo1 = new LevelDataInfo("获取物品蔚蓝星球", "在5分钟之内完成关卡目标,血量不低于0");
        listLevelData.Add(new LevelData(0, "第一关:迷失之城", true, levelDataInfo0));
        listLevelData.Add(new LevelData(1, "第二关:星系迷航", false, levelDataInfo1));
    }
    //存储数据到XML文件中
    private void StoreDataToXMLFile()
    {
        string s = XmlOperation.GetInstance().SerializeObject(listLevelData, typeof(List<LevelData>));                         //对象序列化
        Debug.Log("持久化xml数据s="+s);
        Debug.Log("创建xml文件_fileName="+_fileName);

        XmlOperation.GetInstance().CreatXML(_fileName, s);                                                                     //创建XML文件并写入数据
        Debug.Log("创建xml完成!");

    }
    //从XML文件中读取数据
    private void ReadDataFromXMLFile()
    {
        try
        {
            string strTemp = XmlOperation.GetInstance().LoadXML(_fileName);                                                    //读取数据
            listLevelData = XmlOperation.GetInstance().DeserializeObject(strTemp,typeof(List<LevelData>)) as List<LevelData>;  //反序列化对象

            foreach(LevelData dataItem in listLevelData)                                                                       //遍历并打印
            {
                Debug.Log("关卡序号:" + dataItem.levelNumber);
                Debug.Log("关卡名称:" + dataItem.levelName);
                Debug.Log("是否解锁:" + dataItem.isUnlock);
                Debug.Log("关卡要求:" + dataItem.levelDataInfos.demandOfPass);
                Debug.Log("详细说明:" + dataItem.levelDataInfos.detailContent);
            }
                
        }
        catch
        {
            Debug.Log("[系统读取XML文件错误ReadDataFromXMLFile()]:请检查!");
        }
    }


}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值