Unity中 XML读写与加密

整体思路解析

数据存储和加密的主要逻辑思路:

使用XmlSerializer类对需要保存的数据类进行序列化操作,得到一串字符串。
将得到的字符串使用RijndaeManaged类和ICrytoTransform类进行加密操作,获得加密之后的字符串。
根据平台类型,确定文件保存的路径。
使用StreamWriter类将字符串保存到文件中。

数据加载和解密的主要逻辑思路:

根据存档文件的路径,使用StreamReader类读取文件中的内容(一串加密过的字符串)。
使用RijndaeManaged类和ICrytoTransform类对读取的文件内容进行解密操作,获得一串解密后的字符串。
使用XmlSerializer类对解密后的字符串进行反序列化操作,获得具体的游戏数据,并使用数据对游戏中的数据进行转换操作。

具体实现
首先创建XmlManager类,此类用来序列化与写入操作:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using UnityEngine;

public class XmlManager {
    /// <summary>
    /// 加密和解密秘钥
    /// </summary>
    byte[] _keyArray = UTF8Encoding.UTF8.GetBytes("12348578902329367887724456789012");
    public bool HasFlie(string flieName)
    {
        return File.Exists(flieName);
    }
    /// <summary>
    /// 创建XML
    /// </summary>
    /// <param name="flieName"></param>
    /// <param name="dataString"></param>
    public void CreateXML(string flieName, String dataString)
    {
        StreamWriter writer;
        writer = File.CreateText(flieName);
        writer.Write(/*dataString*/Encrypt(dataString));
        writer.Close();
    }
    /// <summary>
    /// 加载XML
    /// </summary>
    /// <param name="flieName"></param>
    /// <returns></returns>
    public string LoadXML(string flieName)
    {
        StreamReader reader = File.OpenText(flieName);
        string dataString = reader.ReadToEnd();
        reader.Close();
        return /*dataString*/Decrypt(dataString);
    }

    #region 序列化/反序列化
    /// <summary>
    /// 序列化
    /// </summary>
    /// <param name="pObject"></param>
    /// <param name="ty"></param>
    /// <returns></returns>
    public String SerializedObject(object pObject, System.Type ty)
    {
        MemoryStream mStream = new MemoryStream();
        XmlSerializer xs = new XmlSerializer(ty);
        XmlTextWriter xmlTextWriter = new XmlTextWriter(mStream, Encoding.UTF8);
        xs.Serialize(xmlTextWriter, pObject);
        mStream = (MemoryStream)xmlTextWriter.BaseStream;
        return UTF8ByteArrayToString(mStream.ToArray());
    }
    /// <summary>
    /// 反序列化
    /// </summary>
    /// <param name="serializedString"></param>
    /// <param name="ty"></param>
    /// <returns></returns>
    public object DeserializedObject(string serializedString, System.Type ty)
    {
        XmlSerializer xs = new XmlSerializer(ty);
        MemoryStream mStream = new MemoryStream(stringToUTF8ByteArray(serializedString));
        return xs.Deserialize(mStream);
    }

    public string UTF8ByteArrayToString(byte[] bytes)
    {
        UTF8Encoding encoding = new UTF8Encoding();
        return encoding.GetString(bytes);
    }

    byte[] stringToUTF8ByteArray(string dataString)
    {
        UTF8Encoding encoding = new UTF8Encoding();
        return encoding.GetBytes(dataString);
    }
    #endregion

    #region 使用ICryptTransform加密/解密
    /// <summary>
    /// 使用ICryptTransform进行加密
    /// </summary>
    /// <param name="toEncrypt"></param>
    /// <returns></returns>
    public string Encrypt(string toEncrypt) {
        ICryptoTransform cTransform = GetRijndaelManaged().CreateEncryptor();
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
       
        return Convert.ToBase64String(resultArray,0,resultArray.Length);
    }
    /// <summary>
    /// 使用ICryptTransform进行解密
    /// </summary>
    /// <param name="toDecrypt"></param>
    /// <returns></returns>
    public string Decrypt(string toDecrypt)
    {
        ICryptoTransform cTransform = GetRijndaelManaged().CreateDecryptor();
        byte[] toDecryptArray = Convert.FromBase64String(toDecrypt);
        byte[] resultArray = cTransform.TransformFinalBlock(toDecryptArray, 0, toDecryptArray.Length);
        return UTF8Encoding.UTF8.GetString(resultArray);
    }

    RijndaelManaged GetRijndaelManaged()
    {
        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = _keyArray;
        rDel.Mode = CipherMode.ECB;
        rDel.Padding = PaddingMode.PKCS7;
        return rDel;
    }
    #endregion
}

然后创建一个存储数据的类

public class DevicePrice
{
    //------------AVS110
    /// <summary>
    /// 光电版
    /// </summary>
    public string Price30529143 ;
    /// <summary>
    /// 视频版
    /// </summary>
    public string Price30527071 ;
    /// <summary>
    /// 全配版
    /// </summary>
    public string Price30527072 ;
    public DevicePrice()
    {
        Price30529143 = "46113";
        Price30527071 = "53100";
        Price30527072 = "72546";
    }
}

操作类DataManager:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class DataManager : MonoBehaviour {
    #region 共有变量
    #endregion
    #region 私有变量
    string dataFileName = "Price.Xml";
    XmlManager xm = new XmlManager();
    private DevicePrice m_devicePrice;
    #endregion
    // Use this for initialization
    void Start () {
        m_devicePrice = new DevicePrice();
        LoadPrice();
    }
	
	// Update is called once per frame
	void Update () {}
    /// <summary>
    /// 创建XML
    /// 默认保存在桌面
    /// </summary>
    public void CreatXML()
    {
        string dataFilePath = GetDataPath() + "/" + dataFileName;
        string serializedDataString = xm.SerializedObject(m_devicePrice, typeof(DevicePrice));
        xm.CreateXML(dataFilePath, serializedDataString);
        string dataFilePath2 = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "/" + dataFileName;
        xm.CreateXML(dataFilePath2, serializedDataString);
    }
    /// <summary>
    /// 加载价格
    /// </summary>
    public void LoadPrice()
    {
        string dataFilePath = GetDataPath() + "/" + dataFileName;
        if (xm.HasFlie(dataFilePath))
        {
            string dataString = xm.LoadXML(dataFilePath);
            DevicePrice devicePriceFromXML = xm.DeserializedObject(dataString, typeof(DevicePrice)) as DevicePrice;
            if (devicePriceFromXML != null)
            {
                m_devicePrice = devicePriceFromXML;
            }               
            else
                Debug.Log("devicePriceFromXML is null");
        }
    }
    string GetDataPath()
    {
        //return Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
        return Application.dataPath;
        //return Application.streamingAssetsPath+"/Data";
    }
}

加密前:

<?xml version="1.0" encoding="UTF-8"?>

-<DevicePrice xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<Price30529143>46113</Price30529143>

<Price30527071>53100</Price30527071>

<Price30527072>72546</Price30527072>

</DevicePrice>

加密后:

yE2bP3gBwnYjvtvqcvbpudOi7MjZVP/kRwAnpo9njVqErh8dOdbUn4TthAl7rFRsTp9DPY54WOP2/IubyL9hNskqmnO/V4Ru69kVjDlkSkmNLYKF4VuX/Xl+MoKjfVHb7eZH+St724bx5q6e/QAv3LgOnAYX19YGsmfV24ANgLXqilKpE0potMRdhHFr0cF2dKpY6tFMyqJZAkR38RGkdueD4Hq8eOILxzTXK5LODel2KnmP9tqoXIBLPT1zN0nQ2iOMdZU+AcXPfpUdXjZ6s5qaWQj7qDUt9jC9+69VZmqo+1onSaRbRS4RuaZ4MIr942VHMM6rGdXdjUAViEfTO0QIi+GsN/90/3t7AzN8lZaU1CUT1ePqVYbq7Hv8TvN+fmIa3GL+PEB0e6qXoDC9DqAAx8sRQmFZgf509/hQRQCLlmBo9geFmROG2ENi2I/nAtSGD6tvjbMnbCtGle8jw5UqoZqMRHBeHHZbEK19vgqju3aEMBkGkA2l46q+OPfcoXurv3QhffD5l2dYIe3X20JOQiV/Vrf4vykRJ+CLo4mxG3BZf9oPS7bZE+etd/jOazonE+lNoZFi3G2vVkHrMZNxJZdxy592bpJEUuQL7x8AsBfbXqsy4ksSt05ax4o3ZhcN+sLNFVJt4Nt8VHRSmEp1LzF0NBdR7o3hoyroUhpzo+99a27XHfY7ivwRCZYOxMXewHa1/4vZ1pGdBasfKaB7BhUjHfKsM6hOM9zXKZ9fJBKfx+SRcOoKOeBqjIBhI1FJOmYixds7afadep2iwM9i/0ObPQ7n6KGuCwbhbDW2xg8AeJsMDYUdXOt7W28exKHFFSI6gdSl3LUsX6EqOrXzZ13qD5QgSWGZAIpP9hR4Y0WkBI0SApXW+gMx/G1+UtUZYnG/umviA4uDKJOPIvEfMdDbrtct4N7bjvbXhTV563tljgzrm9p2zW41K/lGymPr2eAd+ZCvRQcE6kU8Yv2C8irfGMpv
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值