开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:676

当前位置:游戏蛮牛 技术专区 教程分享

查看: 468|回复: 5

[基础知识] Unity中将类对象保存到XML中

[复制链接]  [移动端链接]
7日久生情
4285/5000
排名
2274
昨日变化
1

1646

主题

1657

帖子

4285

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
132510
好友
17
蛮牛币
62110
威望
0
注册时间
2015-12-24
在线时间
352 小时
最后登录
2017-6-20
发表于 2016-3-28 10:57:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
  该代码包含两个功能

  (1)在Unity中在本地创建XML文件,将类对象转换为字符串保存到XML文件中

  (2)将存入的XML文件读取出来转换为相应的 类对象

  [csharp] view plain copy

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

  }

  }


回复

使用道具 举报

5熟悉之中
740/1000
排名
2764
昨日变化
19

4

主题

110

帖子

740

积分

Rank: 5Rank: 5

UID
86759
好友
5
蛮牛币
2567
威望
0
注册时间
2015-3-29
在线时间
226 小时
最后登录
2017-9-20
发表于 2017-1-10 15:37:46 | 显示全部楼层
谢谢楼主分享

回复

使用道具 举报

7日久生情
1654/5000
排名
1883
昨日变化
6

29

主题

544

帖子

1654

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
5421
威望
0
注册时间
2015-1-20
在线时间
515 小时
最后登录
2017-9-18
发表于 2017-2-22 04:22:47 | 显示全部楼层
[C#] 纯文本查看 复制代码
 view plain copy

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

  }

  }

回复 支持 反对

使用道具 举报

5熟悉之中
634/1000
排名
4200
昨日变化
2

0

主题

197

帖子

634

积分

Rank: 5Rank: 5

UID
164084
好友
0
蛮牛币
1432
威望
0
注册时间
2016-8-24
在线时间
175 小时
最后登录
2017-9-3
发表于 2017-7-4 11:58:22 | 显示全部楼层
谢谢楼主的分享

回复

使用道具 举报

5熟悉之中
574/1000
排名
4740
昨日变化
2

4

主题

194

帖子

574

积分

Rank: 5Rank: 5

UID
44597
好友
0
蛮牛币
2176
威望
0
注册时间
2014-9-12
在线时间
150 小时
最后登录
2017-8-31
发表于 2017-7-8 18:11:01 | 显示全部楼层

谢谢楼主的分享

回复

使用道具 举报

5熟悉之中
708/1000
排名
5676
昨日变化
44

0

主题

381

帖子

708

积分

Rank: 5Rank: 5

UID
209046
好友
0
蛮牛币
1129
威望
0
注册时间
2017-3-30
在线时间
145 小时
最后登录
2017-9-20

迈向小康

发表于 2017-7-26 08:43:51 | 显示全部楼层
不错 赞
[发帖际遇]: sunkai 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表