Unity序列化之XML,JSON

Wesley13
• 阅读 546

1.先介绍一下 XML 和 JSON 是什么东西吧?

      (1)XML

扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进 行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。
XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。

      (2)Json

JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。JSON采用兼容性很高的、完全独立于语言文本格式,同时也具备类似于C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)体系的行为。这些特性使JSON成为理想的数据交换语言。

        说了那么多,其实就是数据的两种保存格式。主要用于配置文件,描述数据,存储数据,数据传输等等。

2.因为Xml和Json都可以办到这些事情,那么它们之间有什么区别么?各自的优缺点?

      (1)XML

优点:格式统一,符合标准;.容易与其他系统进行远程交互,数据共享比较方便。

        缺点:XML文件庞大,文件格式复杂,传输占带宽;服务器端和客户端解析XML花费较多的资源和时间;需要花费大量代码来解析XML;

      (2)Json

优点:数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;.支持多种语言;

        缺点:可读性较xml略差;

         总而言之,两者可以相互转换,功能都是相差无几的。但是json比xml较好,但xml更加通用。

3.XML使用的简单介绍.

a.先来看一段简单的xml代码。

  1. Tom

  2. 20

  3. 20111234

  4. Shierly

  5. 19

  6. 20113210

  7. Lili

  8. 21

  9. 20111110

很显然,可以看出来,这段代码描述的是一个名叫Dreamer的团队有三个成员,还分别记录了这三个成员的相关信息。所以可以看出来XML的可读性十分强。所以我们可以用XML去描述 我们代码中的一些数据关系,描述一个对象。这也就是将对象序列化。然后使用的地方再将xml文件解析出来重新组成原来的对象,这就实现了复杂数据的传输。

b.在untiy中用代码生成xml文件。( 可以使用C#自带的库,不需要引入其他库。using System.Xml )

  1. public void CreateXML()

  2. {

  3. //xml保存的路径,注意路径。

  4. string filepath = "E:/my.xml";

  5. //继续判断当前路径下是否有该文件

  6. if(!File.Exists (filepath))

  7. {

  8. //创建XML文档实例

  9. XmlDocument xmlDoc = new XmlDocument();

  10. //创建root节点,也就是最上一层节点

  11. XmlElement root = xmlDoc.CreateElement( "team");

  12. root.SetAttribute( "name", "Dreamer");

  13. //继续创建下一层节点

  14. XmlElement student = xmlDoc.CreateElement( "student");

  15. //继续创建下一层节点

  16. XmlElement name = xmlDoc.CreateElement( "name");

  17. //设置节点中的数值

  18. name.InnerText = "Tom";

  19. XmlElement age = xmlDoc.CreateElement( "age");

  20. age.InnerText = "20";

  21. XmlElement id = xmlDoc.CreateElement( "id");

  22. id.InnerText = "20111234";

  23. //把节点一层一层的添加至XMLDoc中 ,请仔细看它们之间的先后顺序,这将是生成XML文件的顺序

  24. student.AppendChild(name);

  25. student.AppendChild(age);

  26. student.AppendChild(id);

  27. root.AppendChild(student);

  28. student = xmlDoc.CreateElement( "student");

  29. name = xmlDoc.CreateElement( "name");

  30. name.InnerText = "Shierly";

  31. age = xmlDoc.CreateElement( "age");

  32. age.InnerText = "19";

  33. id = xmlDoc.CreateElement( "id");

  34. id.InnerText = "20113210";

  35. student.AppendChild(name);

  36. student.AppendChild(age);

  37. student.AppendChild(id);

  38. root.AppendChild(student);

  39. student = xmlDoc.CreateElement( "student");

  40. name = xmlDoc.CreateElement( "name");

  41. name.InnerText = "Lili";

  42. age = xmlDoc.CreateElement( "age");

  43. age.InnerText = "21";

  44. id = xmlDoc.CreateElement( "id");

  45. id.InnerText = "20111110";

  46. student.AppendChild(name);

  47. student.AppendChild(age);

  48. student.AppendChild(id);

  49. root.AppendChild(student);

  50. xmlDoc.AppendChild(root);

  51. //把XML文件保存至本地

  52. xmlDoc.Save(filepath);

  53. }

  54. }

这个代码运行后就会在目标文件夹中生成一个xml文件而文件内容就是1中的那段xml代码。

可以看出来 XmlElement 是基本结构单元。也就是xml中的一对

1.我们可以对这个结构单元添加属性:xmlelement.SetAttribute(name,value)。

2.也可以对这个结构单元添加子结构单元:xmlelement.AppendChild(childelement)。

3.如果该结构单元没有子结构了还可以设置它的内容值:xmlelement.InnerText = value.

c.更新xml文件( 修改第三个学生的名字为Jack )

  1. public void UpdateXml()

  2. {

  3. string filepath = "E:/my.xml";

  4. if (File.Exists(filepath))

  5. {

  6. XmlDocument xmlDoc = new XmlDocument();

  7. //根据路径将XML读取出来

  8. xmlDoc.Load(filepath);

  9. //得到team下的所有student节点.

  10. XmlNodeList studentlist = xmlDoc.SelectSingleNode( "team").ChildNodes;

  11. //遍历所有子节点

  12. foreach (XmlElement student in studentlist)

  13. {

  14. XmlNode name = student.SelectSingleNode( "name");

  15. if (name.InnerText.Equals("Lili"))

  16. {

  17. name.InnerText = "Jack";

  18. }

  19. }

  20. xmlDoc.Save(filepath);

  21. }

  22. }

请注意:xmlelement.SelectSingleNode(name)是选取该节点下第一个子节点中名字为name的节点。必须是父子,不能隔两级及以上。

更新结果:

  1. Tom

  2. 20

  3. 20111234

  4. Shierly

  5. 19

  6. 20113210

  7. Jack

  8. 21

  9. 20111110

d.添加xml属性( 增加一个学生:Sharo,22,20112312 )

  1. public void InsertXml()

  2. {

  3. string filepath = "E:/my.xml";

  4. if (File.Exists(filepath))

  5. {

  6. XmlDocument xmlDoc = new XmlDocument();

  7. //根据路径将XML读取出来

  8. xmlDoc.Load(filepath);

  9. XmlNode team = xmlDoc.SelectSingleNode( "team");

  10. XmlElement newstudent = xmlDoc.CreateElement( "student");

  11. XmlElement name = xmlDoc.CreateElement( "name");

  12. name.InnerText = "Sharo";

  13. XmlElement age = xmlDoc.CreateElement( "age");

  14. age.InnerText = "22";

  15. XmlElement id = xmlDoc.CreateElement( "id");

  16. id.InnerText = "20112312";

  17. //向新队员添加属性

  18. newstudent.AppendChild(name);

  19. newstudent.AppendChild(age);

  20. newstudent.AppendChild(id);

  21. //将新队员添加到团队里面

  22. team.AppendChild(newstudent);

  23. xmlDoc.Save(filepath);

  24. }

  25. }

上述代码演示了添加节点,其实对节点添加属性也是一样的。

更新结果:

  1. Tom

  2. 20

  3. 20111234

  4. Shierly

  5. 19

  6. 20113210

  7. Jack

  8. 21

  9. 20111110

  10. Sharo

  11. 22

  12. 20112312

e.删除xml节点(删除Tom学生的信息)

  1. public void DeleteXml()

  2. {

  3. string filepath = "E:/my.xml";

  4. if (File.Exists(filepath))

  5. {

  6. XmlDocument xmlDoc = new XmlDocument();

  7. //根据路径将XML读取出来

  8. xmlDoc.Load(filepath);

  9. XmlNode team = xmlDoc.SelectSingleNode( "team");

  10. XmlNodeList studentlist = team.ChildNodes;

  11. foreach(XmlNode student in studentlist)

  12. {

  13. XmlNode name = student.SelectSingleNode( "name");

  14. if(name.InnerText.Equals("Tom"))

  15. {

  16. team.RemoveChild(student);

  17. }

  18. }

  19. xmlDoc.Save(filepath);

  20. }

  21. }

可以使用 xmlelement.RemoveAll() 删除所有子节点

更新结果:

  1. Shierly

  2. 19

  3. 20113210

  4. Jack

  5. 21

  6. 20111110

  7. Sharo

  8. 22

  9. 20112312

f.解析xml文件

  1. public void LoadXml()

  2. {

  3. string filepath = "E:/my.xml";

  4. if (File.Exists(filepath))

  5. {

  6. XmlDocument xmlDoc = new XmlDocument();

  7. //根据路径将XML读取出来

  8. xmlDoc.Load(filepath);

  9. XmlElement team = (XmlElement)xmlDoc.SelectSingleNode( "team");

  10. string teamname = team.GetAttribute("name");

  11. Console.WriteLine( "这是一个名叫\"" + teamname + "\"的队伍:");

  12. XmlNodeList studentlist = team.ChildNodes;

  13. Console.WriteLine( "一共有" + studentlist.Count + "人");

  14. foreach (XmlNode student in studentlist)

  15. {

  16. XmlNode name = student.SelectSingleNode( "name");

  17. XmlNode age = student.SelectSingleNode( "age");

  18. XmlNode id = student.SelectSingleNode( "id");

  19. Console.WriteLine( "姓名:" + name.InnerText + ",年龄:" + age.InnerText + ",学号:" + id.InnerText);

  20. }

  21. xmlDoc.Save(filepath);

  22. }

  23. }

在实际情况中,我们一般在解析xml的时候去给对象相关属性赋值。相当于是在还原xml中表示的对象数据。

输出结果:

  1. 这是一个名叫 "Dreamer"的队伍:

  2. 一共有 3人

  3. 姓名:Shierly,年龄: 19,学号:20113210

  4. 姓名:Jack,年龄: 21,学号:20111110

  5. 姓名:Sharo,年龄: 22,学号:20112312

4.Json使用的简单介绍.(Json使用需要下载LitJson的包)

a.先来看看json代码

  1. {

  2. "Name" : "Dreamer",

  3. "Number" : 3,

  4. "Member" :

  5. [

  6. {

  7. "Name" : "Tom",

  8. "Age" : 20,

  9. "Id" : "20111234"

  10. },

  11. {

  12. "Name" : "Jack",

  13. "Age" : 22,

  14. "Id" : "20112312"

  15. }

  16. ]

  17. }

恩这个描述看起来比较熟悉?没错,这就是键值对的表现方式。相比起xml来说json省略了很多冗余的表达格式。

仔细看可以发现json的基本结构单元就是以{ }括起来的一组键值对,而这个结构单元也可以作为值。而[ ]中括号就表示数组,数组的每个元素都是一个结构单元。

键值对的表示是 key :value,键值对之间用,隔开。

b.生成json代码

  1. public void CreateJson()

  2. {

  3. string path = "E:/json.txt";

  4. FileInfo t = new FileInfo(path);

  5. StreamWriter sw = t.CreateText();

  6. StringBuilder sb = new StringBuilder();

  7. JsonWriter writer = new JsonWriter(sb);

  8. //相当于写下了'{'

  9. writer.WriteObjectStart();

  10. //相当于写下了"Name":

  11. writer.WritePropertyName( "Name");

  12. //相当于写下了"Dreamer"

  13. writer.Write( "Dreamer");

  14. writer.WritePropertyName( "Number");

  15. writer.Write( "3");

  16. writer.WritePropertyName( "Member");

  17. //相当于写下了'['

  18. writer.WriteArrayStart();

  19. writer.WriteObjectStart();

  20. writer.WritePropertyName( "Name");

  21. writer.Write( "Tom");

  22. writer.WritePropertyName( "Age");

  23. writer.Write( "20");

  24. writer.WritePropertyName( "Id");

  25. writer.Write( "20111234");

  26. //相当于写下了'}'

  27. writer.WriteObjectEnd();

  28. writer.WriteObjectStart();

  29. writer.WritePropertyName( "Name");

  30. writer.Write( "Jack");

  31. writer.WritePropertyName( "Age");

  32. writer.Write( "22");

  33. writer.WritePropertyName( "Id");

  34. writer.Write( "20112312");

  35. writer.WriteObjectEnd();

  36. //相当于写下了']'

  37. writer.WriteArrayEnd();

  38. writer.WriteObjectEnd();

  39. sw.WriteLine(sb.ToString());

  40. sw.Close();

  41. }

这段代码就是生成上面json代码的生成代码。

很显然,json生成的代码更像是html这类代码一样,按照生成文件的格式调用对应的API。不过,json有更好的方式,它可以直接对对象序列化。

看下面的例子:

  1. using UnityEngine;

  2. using LitJson;

  3. public class A

  4. {

  5. public string name = "yzl";

  6. public int old = 20;

  7. }

  8. public class Test : MonoBehaviour

  9. {

  10. void Start()

  11. {

  12. A a = new A();

  13. Debug.Log(JsonMapper.ToJson(a));

  14. }

  15. }

观察控制台输出:{"name":"yzl","old":20}

发现,json可以直接对对象里面的属性序列化生成对应的json文件。这就是很方便的地方了。当然,xml也有这个功能,但是需要对类的属性添加节点标签。相比json要麻烦一些。

c.json的增删改( 增加队伍地址属性,删除队伍人数属性,修改队名 )

  1. using UnityEngine;

  2. using System.Collections;

  3. using System;

  4. using System.Collections.Generic;

  5. using LitJson;

  6. using System.IO;

  7. public class Test : MonoBehaviour

  8. {

  9. void Start()

  10. {

  11. StreamReader sr = File.OpenText( "E:/json.txt");

  12. string strline = sr.ReadToEnd();

  13. JsonData jd = JsonMapper.ToObject(strline);

  14. //修改队名

  15. jd[ "Name"] = "Winer";

  16. //添加队伍地址属性

  17. jd[ "Address"] = "Sichuan";

  18. //删除队伍人数属性

  19. ((IDictionary)jd).Remove( "Number");

  20. Debug.Log(jd.ToJson());

  21. sr.Close();

  22. }

  23. }

可以看出来json使用起来要比xml方便许多,解析的使用方法和C#的字典类似。

d.json的解析查看

  1. using UnityEngine;

  2. using System.Collections;

  3. using System;

  4. using System.Collections.Generic;

  5. using LitJson;

  6. using System.IO;

  7. public class Test : MonoBehaviour

  8. {

  9. void Start()

  10. {

  11. StreamReader sr = File.OpenText( "E:/json.txt");

  12. string strline = sr.ReadToEnd();

  13. JsonData jd = JsonMapper.ToObject(strline);

  14. Debug.Log( "队伍名:" + jd["Name"]);

  15. Debug.Log( "队伍人数:" + jd["Number"]);

  16. for (int i = 0; i < jd["Member"].Count; i++)

  17. {

  18. Debug.Log( "姓名:" + jd["Member"][i]["Name"] + ",年龄:" + jd["Member"][i]["Age"] + ",学号:" + jd["Member"][i]["Id"]);

  19. }

  20. sr.Close();

  21. }

  22. }

输出结果:

队伍名:Dreamer
队伍人数:3
姓名:Tom,年龄:20,学号:20111234
姓名:Jack,年龄:22,学号:20112312
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
2年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
JSON与XML的区别比较
1.定义介绍(1).XML定义扩展标记语言(ExtensibleMarkupLanguage,XML),用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML使用DTD(documenttypedefinition)文档类型定义来组织数据;格式统一,跨平台和语
Wesley13 Wesley13
2年前
Java高级特性 第12节 XML技术
一、XML简介  1.XML介绍XML是可扩展标记语言(ExtensibleMarkupLanguage),XML是一种数据格式,类似HTML,是使用标签进行内容描述的技术,与HTML不同的是,XML的标签和属性都是根据业务需求自定义的。  XML可以作为配置文件的载体,例如servlet、struct2、h
Wesley13 Wesley13
2年前
Unity横屏
Android下发现Unity里面的Player设置,并不能完全有效,比如打开了自动旋转,启动的时候还是会横屏,修改XML添加以下代码<applicationandroid:icon"@drawable/ic\_launcher"                    android:label"@string/app\_name"
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
小万哥 小万哥
1个月前
XML 简介及用法详解
XML是一种用于存储和传输数据的与软件和硬件无关的工具。什么是XML?XML代表eXtensibleMarkupLanguage(可扩展标记语言)。XML是一种与HTML非常相似的标记语言。XML被设计用于存储和传输数据。XML被设计成具有自我描述性。XM