该代码包含两个功能
(1)在Unity中在本地创建XML文件,将类对象转换为字符串保存到XML文件中
(2)将存入的XML文件读取出来转换为相应的 类对象
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Text;
public class AAA
{
public int num;
public BBB bbb;
public AAA()
{
num = 0;
bbb = new BBB();
}
}
public class BBB
{
string name;
public BBB()
{
name = "aaaaa";
}
}
// 将类对象保存为 XML, 将XML读取为类对象
public class WriteReadTxt : MonoBehaviour {
string path = "";
void Start()
{
path = Application.dataPath + "StreamingAssets/AAA/1.xml";
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A)) // 保存对象
{
AAA aaa = new AAA();
CreateWriteXML<AAA>( path, aaa, true); // 将类直接保存为 XML文件
}
if (Input.GetKeyDown(KeyCode.D)) // 读取对象
{
AAA aaa = new AAA();
aaa = ReadXmlFile<AAA>(path); // 将读取的XML文件转换为类
}
}
// 创建写入文件 , 参数1 文件路径, 参数 2 写入信息, 参数3 是否删除之前的重新创建
public void CreateWriteFile(string path, string info, bool isRelace)
{
StreamWriter sw;
FileInfo t = new FileInfo( path); //获取路径下文件信息
if (t.Exists && isRelace) //如果存在则删除
{
File.Delete(path);
}
if (!t.Exists) //如果文件不存在则创建一个
{
sw = t.CreateText();
}
else
{
sw = t.AppendText();
}
sw.WriteLine( info); //写入信息
sw.Close();
sw.Dispose();
}
//读取文件, 参数1 文件路径, 参数2 保存路径的集合
public List<string> ReadTxtFile(string path, List<string> saveList)
{
FileInfo info = new FileInfo(path); //获取路径下文件信息
if (!info.Exists) //如果不存在返回
{
Debug.Log("!exist " + path);
return saveList;
}
StreamReader sr = null;
sr = File.OpenText(path); //存在则打开文件
string line;
while ((line = sr.ReadLine()) != null) // 一行一行读取文件
{
saveList.Add(line); //向保存文件集合添加 路径字符串
}
sr.Close();
sr.Dispose();
return saveList;
}
// 参数1 路径,参数2 需要保存的类,参数3 是否需要替换
public void CreateWriteXML<T>( string path, T t, bool isRelace)
{
string data = SerializeObject<T>(t); // 将类对象转换为 字符串
CreateWriteFile(path, data, isRelace);
}
public T ReadXmlFile<T>(string path)
{
List<string> dataList = new List<string>();
string data = "";
dataList = ReadTxtFile(path, dataList);
foreach (string str in dataList)
{
data += str;
}
T t = (T)DeserializeObject<T>(data);
return t;
}
private string UTF8ByteArrayToString(byte[] characters)
{
UTF8Encoding encoding = new UTF8Encoding();
string constructedString = encoding.GetString(characters);
return (constructedString);
}
private byte[] StringToUTF8ByteArray(string pXmlString)
{
UTF8Encoding encoding = new UTF8Encoding();
byte[] byteArray = encoding.GetBytes(pXmlString);
return byteArray;
}
// 保存xml 前先将 类对象转换为 字符串
private string SerializeObject<T>(object pObject)
{
string XmlizedString = null;
MemoryStream memoryStream = new MemoryStream();
//XmlSerializer xs = new XmlSerializer(typeof(UserData));
XmlSerializer xs = new XmlSerializer(typeof(T));
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
xs.Serialize(xmlTextWriter, pObject);
memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());
return XmlizedString;
}
// 将读取的xml字符串转换为 类对象
private object DeserializeObject<T>(string pXmlizedString)
{
//XmlSerializer xs = new XmlSerializer(typeof(UserData));
XmlSerializer xs = new XmlSerializer(typeof(T));
MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString));
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
return xs.Deserialize(memoryStream);
}
}