加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Unity中将类对象保存到XML中

发布时间:2020-12-16 09:22:36 所属栏目:百科 来源:网络整理
导读:该代码包含两个功能 (1)在Unity中在本地创建XML文件,将类对象转换为字符串保存到XML文件中 (2)将存入的XML文件读取出来转换为相应的 类对象 using UnityEngine;using System;using System.Collections;using System.Collections.Generic;using System.I

该代码包含两个功能

(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);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读