文章脚本来源于《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()]:请检查!");
}
}
}