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

扫一扫,访问微社区

教程分享

关注:706

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

查看: 990|回复: 2

[基础知识] Unity xml序列化与反序列化 多平台

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

1646

主题

1657

帖子

4303

积分

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

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

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

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

x
  换平台确实是一个头疼的问题,本来在pc用.net的json处理数据很是顺手的,但是发布web版本后,发现他不支持。后面找了好几个开源json都不能很好的支持web,或者不能支持List等。于是我就想着自己利用xml写一个序列化与反序列化用来存储数据或者解析数据。这里我只测试了pc与web平台,移动端的没有测试。

  自定义xml序列化脚本,因为可能使用到中文,所以设置utf-8编码:

  using UnityEngine;

  using System.Collections;

  using System.Text;

  using System.IO;

  using System.Xml;

  using System.Xml.Serialization;

  using System;

  /// <summary>

  /// XML序列化

  /// </summary>

  public class CustomXMLData  {

  private static CustomXMLData xmlData;

  /// <summary>

  /// 获取本类对象

  /// </summary>

  /// <returns></returns>

  public static CustomXMLData getInstance()

  {

  if (xmlData == null)

  {

  xmlData = new CustomXMLData();

  }

  return xmlData;

  }

  /// <summary>

  /// 序列化--内存流

  /// </summary>

  /// <param name="pObject">对象</param>

  /// <param name="t">类型</param>

  /// <returns></returns>

  public string SerializeObject(object pObject, Type t)

  {

  string XmlizedString = null;

  MemoryStream memoryStream = new MemoryStream();

  XmlSerializer xs = new XmlSerializer(t);

  XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);

  xs.Serialize(xmlTextWriter, pObject);

  memoryStream = (MemoryStream)xmlTextWriter.BaseStream;

  XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());

  Debug.Log("" + XmlizedString);

  return XmlizedString;

  }

  /// <summary>

  /// 字节转string

  /// </summary>

  /// <param name="characters">字节数组</param>

  /// <returns></returns>

  private string UTF8ByteArrayToString(byte[] characters)

  {

  UTF8Encoding encoding = new UTF8Encoding();

  string constructedString = encoding.GetString(characters);

  return (constructedString);

  }

  /// <summary>

  /// 反序列化

  /// </summary>

  /// <param name="pXmlizedString">string内容</param>

  /// <param name="t">类型</param>

  /// <returns></returns>

  public object DeserializeObject(string pXmlizedString, Type t)

  {

  XmlSerializer xs = new XmlSerializer(t);

  MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString));

  XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);

  return xs.Deserialize(memoryStream);

  }

  /// <summary>

  /// 字符串转字节数组

  /// </summary>

  /// <param name="pXmlString">字符内容</param>

  /// <returns></returns>

  private byte[] StringToUTF8ByteArray(string pXmlString)

  {

  UTF8Encoding encoding = new UTF8Encoding();

  byte[] byteArray = encoding.GetBytes(pXmlString);

  return byteArray;

  }

  /// <summary>

  /// 序列化--XML文件

  /// </summary>

  /// <param name="pObject">对象</param>

  /// <param name="t">类型</param>

  /// <param name="XMLPath">生成的xml路径</param>

  public void SerializeObjectXML(object pObject, Type t,string XMLPath)

  {

  XmlWriterSettings ws = new XmlWriterSettings();

  ws.Encoding = Encoding.UTF8;

  XmlWriter xmTextWriter = XmlWriter.Create(XMLPath, ws);

  XmlSerializer xmlFormat = new XmlSerializer(t);

  xmlFormat.Serialize(xmTextWriter,pObject);

  }

  }

  测试脚本:

  [csharp] view plain copy

  using UnityEngine;

  using System.Collections;

  public class Test : MonoBehaviour {

  // Use this for initialization

  void Start () {

  //定义Player对象

  Player player = new Player("学号ID",50,26.5f);

  //序列化 通过内存流转为字符串,可以将字符串存于数据库中存储操作或其他操作

  string serStr=CustomXMLData.getInstance().SerializeObject(player,typeof(Player));

  //反序列化 将字符串解析为Player对象

  Player tempPlayer = (Player)CustomXMLData.getInstance().DeserializeObject(serStr, typeof(Player));

  //序列化 创建本地xml文件

  CustomXMLData.getInstance().SerializeObjectXML(player, typeof(Player), Application.dataPath + "/1.xml");

  //读取xml的内容 并反序列化

  StartCoroutine(ReadXml(Application.dataPath + "/1.xml"));

  }

  // Update is called once per frame

  void Update () {

  }

  /// <summary>

  /// 读取xml的内容 并反序列化

  /// </summary>

  /// <param name="xmlPath">xml文件的路径</param>

  /// <returns></returns>

  IEnumerator ReadXml(string xmlPath)

  {

  Player tempPlayer=null;

  WWW w = new WWW(xmlPath);

  yield return w;

  if(w.error==null)

  tempPlayer = (Player)CustomXMLData.getInstance().DeserializeObject(w.text, typeof(Player));

  }

  }

[发帖际遇]: BobbyKim 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

4四处流浪
349/500
排名
11201
昨日变化
3

0

主题

239

帖子

349

积分

Rank: 4

UID
235457
好友
0
蛮牛币
340
威望
0
注册时间
2017-8-2
在线时间
46 小时
最后登录
2017-10-6
发表于 2017-8-10 12:51:13 | 显示全部楼层
66666666666666666666
[发帖际遇]: hello11 乐于助人,奖励 2 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

4四处流浪
311/500
排名
8076
昨日变化
2

3

主题

50

帖子

311

积分

Rank: 4

UID
172965
好友
2
蛮牛币
477
威望
0
注册时间
2016-9-30
在线时间
136 小时
最后登录
2017-9-1
发表于 2017-8-15 20:00:34 | 显示全部楼层
楼主,我这里有个问题请教下,我做的项目是把49道题随机生成10道题显示在Unity上,需要用到序列化和反序列化怎么做,对了,题目需要用到的内容是题号、题目、正确答案、选项

回复 支持 反对

使用道具 举报

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

本版积分规则

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