序列化与反序列化

4 篇文章 0 订阅

标准流程

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

public class SerializeObjectClass :MonoBehaviour{

	private string m_str_FileLocation;

	private string fileName;
	// Use this for initialization
	void Start () {
		m_str_FileLocation=Application.persistentDataPath;
		fileName="NPC.xml";
	}
	
	// Update is called once per frame
	void Update () {
		if(Input.GetKeyDown(KeyCode.K)){
			NPCData da=new NPCData();
			da.name="luo";
			da.a.Add(3);
			da.a.Add(2);
			da.a.Add(7);
			da.a.Add(5);

			StringIntData int1=new StringIntData();
			int1.name="jiji";
			int1.state=8;

			StringIntData int2=new StringIntData();

			int2.name="dsfdfd";
			int2.state=545445;

			da.stringintData.Add(int1);
			da.stringintData.Add(int2);

			string dataString=SerializeObject(da);
			SaveXML(dataString);
		}

		if(Input.GetKeyDown(KeyCode.U)){
			NPCData da=LoadData();
			Debug.Log(da.a.Count);
			Debug.Log(da.stringintData.Count);

			Debug.Log(da.stringintData[1].state);
		}
	}

	public NPCData LoadData()
	{
		NPCData m_LoadedData=null;
		Debug.Log("start load game data");
		string str_Data = LoadXML();
		if (string.IsNullOrEmpty(str_Data) == true)
		{
			return m_LoadedData;
		}
		m_LoadedData = DeserializeObject(str_Data)as NPCData;
		return m_LoadedData;
		Debug.Log("finish load game data:" + str_Data);
	}
	
	void SaveXML(string str_Data)
	{
		StreamWriter sw;
		FileInfo fi = new FileInfo(m_str_FileLocation + "/" + fileName);
		if (fi.Exists == false)
		{
			sw = fi.CreateText();
		}
		else
		{
			fi.Delete();
			sw = fi.CreateText();
		}
		sw.Write(str_Data);
		sw.Close();
		Debug.Log("SaveXML:" + str_Data);
	}
	string LoadXML()
	{
		string str_FilePath = m_str_FileLocation + "/" + fileName;
		FileInfo fi = new FileInfo(str_FilePath);
		if (fi.Exists == false)
		{
			return null;
		}
		StreamReader sr = File.OpenText(str_FilePath);
		if (sr != null)
		{
			string str_Data = sr.ReadToEnd();
			sr.Close();
			return str_Data;
		}
		else
		{
			return null;
		}
	}
	string SerializeObject(object obj)
	{
		string str_XmlizedString = null;
		MemoryStream ms = new MemoryStream();
		XmlSerializer xs = new XmlSerializer(typeof(NPCData));
		XmlTextWriter xtw = new XmlTextWriter(ms, Encoding.UTF8);
		xs.Serialize(xtw, obj);
		ms = (MemoryStream)xtw.BaseStream;
		str_XmlizedString = UTF8ByteArrayToString(ms.ToArray());
		return str_XmlizedString;
	}
	object DeserializeObject(string str_XmlizedString)
	{
		XmlSerializer xs = new XmlSerializer(typeof(NPCData));
		MemoryStream ms = new MemoryStream(StringToUTF8ByteArray(str_XmlizedString));
		return xs.Deserialize(ms);
	}
	string UTF8ByteArrayToString(byte[] ba)
	{
		UTF8Encoding ue = new UTF8Encoding();
		string str_Constructed = ue.GetString(ba);
		return (str_Constructed);
	}
	byte[] StringToUTF8ByteArray(string str_XmlString)
	{
		UTF8Encoding ue = new UTF8Encoding();
		byte[] ba = ue.GetBytes(str_XmlString);
		return ba;
	}

	public class NPCData{
		public string name;
		public List<int> a=new List<int>();
		public List<StringIntData> stringintData=new List<StringIntData>();
	}

	public class StringIntData{
		public string name;
		public int state;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值