XML文件的序列化和反序列化


一、编写数据实体类,如下所示:

/***
 *
 *  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章数据持久化内容。

猜你喜欢

转载自blog.csdn.net/xiaochenXIHUA/article/details/83316801
今日推荐