一、编写数据实体类,如下所示:
/***
*
* Title:
* 数据持久化技术
*
* Description:
* 功能:
* XML读写
* 关卡数据对象
*
* Date: 2018
*
* Version: 1.0
*
* Modify Recorder:
*
*/
using UnityEngine;
using System.Collections;
public class LevelData{
public int LevelNumber; //关卡编号
public bool IsUnlock; //关卡是否解锁
public string LevelName; //关卡名称
public LevelDetailInfo LevelDetailInfos; //关卡详情要求
public LevelData(){}
public LevelData(int levelNumber, bool isUnlock, string levelname,LevelDetailInfo detailInfo){
this.LevelNumber = levelNumber;
this.IsUnlock = isUnlock;
this.LevelName = levelname;
this.LevelDetailInfos = detailInfo;
}
}
/***
*
* Title:
* 数据持久化技术
*
* Description:
* 功能:
* XML读写
* 数据对象内嵌对象: 关卡详细信息
*
* Date: 2017
*
* Version: 1.0
*
* Modify Recorder:
*
*/
using UnityEngine;
using System.Collections;
public class LevelDetailInfo{
public string DemandOfPass; //通关要求
public string DetailContent; //详细内容
public LevelDetailInfo() { }
public LevelDetailInfo(string demandOfPass, string content){
this.DemandOfPass = demandOfPass;
this.DetailContent = content;
}
}
二、编写XML的核心读/写操作类(包含序列化、反序列化、加密)
/***
*
* Title:
* 数据持久化技术
*
* Description:
* 功能:
* XML读写
* XML 读写核心类
*
* Date: 2017
*
* Version: 1.0
*
* Modify Recorder:
*
*/
using System.Collections;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System;
public class XmlOperation{
private static XmlOperation _Instance = null; //静态类对象
public static XmlOperation GetInstance()
{
if (_Instance == null)
{
_Instance = new XmlOperation();
}
return _Instance;
}
/// <summary> 加密方法
/// 加密方法
///
/// 描述: 加密和解密采用相同的key,具体值自己填,但是必须为32位
/// </summary>
/// <param name="toE"></param>
/// <returns></returns>
public string Encrypt(string toE){
byte[] keyArray = UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012");
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toE);
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);
return Convert.ToBase64String(resultArray,0,resultArray.Length);
}
/// <summary> 解密方法
/// 解密方法
///
/// 描述: 加密和解密采用相同的key,具体值自己填,但是必须为32位
/// </summary>
/// <param name="toD"></param>
/// <returns></returns>
public string Decrypt(string toD){
byte[] keyArray = UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012");
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] toEncryptArray = Convert.FromBase64String(toD);
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);
return UTF8Encoding.UTF8.GetString(resultArray);
}
/// <summary> 序列化对象
/// 序列化对象
/// </summary>
/// <param name="pObject">进行序列化的对象</param>
/// <param name="ty">序列化对象的类型</param>
/// <returns></returns>
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;
}
/// <summary> 反序列化对象
/// 反序列化对象
/// </summary>
/// <param name="pXmlizedString"></param>
/// <param name="ty"></param>
/// <returns></returns>
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);
}
/// <summary> 创建XML文件
/// 创建XML文件
/// </summary>
/// <param name="fileName">文件名称</param>
/// <param name="strFileData">写入的文件数据</param>
public void CreateXML(string fileName,string strFileData){
StreamWriter writer; //写文件流
//string strWriteFileData = Encrypt(strFileData); //是否加密处理
string strWriteFileData = strFileData; //写入的文件数据
writer = File.CreateText(fileName);
writer.Write(strWriteFileData);
writer.Close(); //关闭文件流
}
/// <summary> 读取XML文件
/// 读取XML文件
/// </summary>
/// <param name="fileName">文件名称</param>
/// <returns></returns>
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 string UTF8ByteArrayToString(byte[] characters ){
UTF8Encoding encoding = new UTF8Encoding();
string constructedString = encoding.GetString(characters);
return (constructedString);
}
//字符串转UTF8字节数组
public byte[] StringToUTF8ByteArray(String pXmlString ){
UTF8Encoding encoding = new UTF8Encoding();
byte[] byteArray = encoding.GetBytes(pXmlString);
return byteArray;
}
}
三、XML测试类
/***
*
* Title:
* 数据持久化技术
*
* Description:
* 功能:
* XML读写
* XML读写测试主脚本
*
* Date: 2017
*
* Version: 1.0
*
* Modify Recorder:
*
*/
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class TestXML : MonoBehaviour {
//关卡数据集合
public List<LevelData> listLevelData = new List<LevelData>(); //关卡数据集合
//数据持久化路径
static string _fileName;
void Start () {
_fileName = Application.persistentDataPath + "/UnityProjectLevelData";
//建立测试用例
TestCase();
//存储对象到XML
StoreDateToXMLFile();
//读取测试
ReadDateFromXMLFile();
}
/// <summary>
/// 定义初始化测试用例数据
/// </summary>
public void TestCase(){
LevelDetailInfo levelDetailInfo0=new
LevelDetailInfo("消除2课红钻石", "需要同时消除2课以上的红色钻石,时间5分钟内完成");
LevelDetailInfo levelDetailInfo1 = new
LevelDetailInfo("消除5课红钻石", "需要同时消除5课以上的红色钻石,时间2分钟内完成");
listLevelData.Add(new LevelData(0, true, "第一关", levelDetailInfo0));
listLevelData.Add(new LevelData(1, true, "第二关", levelDetailInfo1));
}
/// <summary>
/// 存储数据到XML文件
/// </summary>
public void StoreDateToXMLFile()
{
//对象序列化
string s = XmlOperation.GetInstance().SerializeObject(listLevelData, typeof(List<LevelData>));
print("持久化xml 数据 s=" + s);
print("创建XML文件_fileName=" + _fileName);
//创建XML文件且写入数据
XmlOperation.GetInstance().CreateXML(_fileName, s);
print("创建XML完成");
}
/// <summary>
/// 从XML文件中读取数据
/// </summary>
public void ReadDateFromXMLFile(){
try{
//读取数据
string strTemp = XmlOperation.GetInstance().LoadXML(_fileName);
print("读取的原始XML数据字符串: " + strTemp);
//反序列化对象
listLevelData = XmlOperation.GetInstance().DeserializeObject
(strTemp, typeof(List<LevelData>)) as List<LevelData>;
//读取出来
foreach (LevelData dataItem in listLevelData){
print("");
print("关卡序号: " + dataItem.LevelNumber);
print("关卡名称: " + dataItem.LevelName);
print("关卡锁定: " + dataItem.IsUnlock);
print("过关要求: " + dataItem.LevelDetailInfos.DemandOfPass);
print("详细说明: " + dataItem.LevelDetailInfos.DetailContent);
}
}
catch{
print("系统读取XML出现错误,请检查");
}
}
}
注:本示例来自《Unity3D/2D游戏开发从0到1》第26章数据持久化内容。