Unity的序列化和反序列化——XML和JSON
⼀、序列化、反序列化
什么是序列化、反序列化?
序列化就是把数据对象转换成⼆进制流保存为本地⽂件的过程。
反序列化就是把储存有数据信息的⼆进制⽂件还原成数据对象的过程。
序列化的意义
以某种储存形式(⼆进制/XML,今天只讲⼆进制⽅法)使⾃定义对象持久化
⽅便将对象从⼀个地⽅移动到另⼀个地⽅(转移⽂件再反序列化读取)
使游戏数据不容易被直接篡改
⼆、XML和JSON
XML
扩展标记语⾔ (Extensible Markup Language, XML) ,⽤于标记电⼦⽂件使其具有结构性的标记语⾔,可以⽤来标记数据、定义数据类型,是⼀种允许⽤户对⾃⼰的标记语⾔进 ⾏定义的源语⾔。 XML使⽤DTD(document type definition)⽂档类型定义来组织数据;格式统⼀,跨平台和语⾔,早已成为业界公认的标准。
XML是标准通⽤标记语⾔ (SGML) 的⼦集,⾮常适合 Web 传输。XML 提供统⼀的⽅法来描述和交换独⽴于应⽤程序或供应商的结构化数据。
优点:格式统⼀,符合标准,容易与其它系统远程交互,数据共享⽅便
缺点:xml⽂件庞⼤,格式复杂,占⽤带宽较多;服务端和客户端解析xml花费较多的时间和资源
JSON
JSON(JavaScript Object Notation)⼀种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进⾏数据交换。JSON采⽤兼容性很⾼的、完全独⽴于语⾔⽂本格式,同时也具备类似于C语⾔的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)体系的⾏为。这些特性使JSON成为理想的数据交换语⾔。
优点:数据格式⽐较简单,易于读写,占⽤带宽⼩,⽀持多种语⾔
缺点:可读性差
总之,XML和JSON就是数据保存的两种格式,主要⽤于配置⽂件,描述数据,存储数据,数据传输等等。
两者可以相互转换,功能类似。但是JSON⽐XML较好⼀些,但xml更通⽤。
XML和JSON代码对⽐
<team name="Dreamer">
<student>
<name>Tom</name>
<age>20</age>
<id>20111234</id>
</student>
<student>
<name>Shierly</name>
<age>19</age>
<id>20113210</id>
</student>
<student>
<name>Lili</name>
<age>21</age>
<id>20111110</id>
</student>
</team>
{
"Name" : "Dreamer",
"Number" : 3,
"Member" :
[
{
"Name" : "Tom",
"Age" : 20,
"Id" : "20111234"
},
{
"Name" : "Jack",
"Age" : 22,
"Id" : "20112312"
}
]
}
JSON的基本结构单元就是以{}包裹的⼀对键值对三、在Unity中⽤代码编写XML 创建XML⽂件
public void CreateXML()
{
//xml保存的路径,注意路径。
string filepath = "E:/my.xml";
//继续判断当前路径下是否有该⽂件
if(!File.Exists (filepath))
{
//创建XML⽂档实例
XmlDocument xmlDoc = new XmlDocument();
//创建root节点,也就是最上⼀层节点
XmlElement root = xmlDoc.CreateElement("team");
root.SetAttribute("name", "Dreamer");
//继续创建下⼀层节点
XmlElement student = xmlDoc.CreateElement("student");
//继续创建下⼀层节点
XmlElement name = xmlDoc.CreateElement("name");
/
/设置节点中的数值
name.InnerText = "Tom";
XmlElement age = xmlDoc.CreateElement("age");
age.InnerText = "20";
XmlElement id = xmlDoc.CreateElement("id");
id.InnerText = "20111234";
//把节点⼀层⼀层的添加⾄XMLDoc中,请仔细看它们之间的先后顺序,这将是⽣成XML⽂件的顺序 student.AppendChild(name);
student.AppendChild(age);
student.AppendChild(id);
root.AppendChild(student);
student = xmlDoc.CreateElement("student");
name = xmlDoc.CreateElement("name");
name.InnerText = "Shierly";
age = xmlDoc.CreateElement("age");
age.InnerText = "19";
id = xmlDoc.CreateElement("id");
id.InnerText = "20113210";
student.AppendChild(name);
student.AppendChild(age);
student.AppendChild(id);
root.AppendChild(student);
student = xmlDoc.CreateElement("student");
name = xmlDoc.CreateElement("name");
name.InnerText = "Lili";
age = xmlDoc.CreateElement("age");
age.InnerText = "21";
id = xmlDoc.CreateElement("id");
id.InnerText = "20111110";
student.AppendChild(name);
student.AppendChild(age);
student.AppendChild(id);
root.AppendChild(student);
xmlDoc.AppendChild(root);
/
/把XML⽂件保存⾄本地
xmlDoc.Save(filepath);
}
}
其实,可以看出主要就五个操作
1.XmlElement 属性名 = xmlDoc.CreateElement("XML中的标签名"):XML中每⼀个标签都是 XmlElement元素,得到如下结果<xml中的标签名></xmlz中的标签名>
// XmlElement root = xmlDoc.CreateElement("team");得到
<team></team>
2.属性名.SetAttribute("XML中的属性名", "属性名对应的属性值"):给对应的标签添加⼀个属性和对应的属性值
<xml中的标签名 xml中的属性名:对应的属性值>
</xmlz中的标签名>
//root.SetAtrribute("name",paoyou);得到
<team name="paoyou"></team>
3.代码中的属性名.InnerText="值":设置标签中的值
<;标签名>值</标签名>
XmlElement name = xmlDoc.CreateElement("name");得到
name.InnerText = "Tom";
<name>Tom</name>
4.属性名.AppendChild(student):标签添加⼦标签
root.AppendChild(name);得到
<team name="paoyou">
<name>Tom</name>
</team>
更新XML⽂件
将第三个学⽣的名字修改为Jack
public void UpdateXml()
{
string filepath = "E:/my.xml";
if (File.Exists(filepath))
{
XmlDocument xmlDoc = new XmlDocument();
//根据路径将XML读取出来
xmlDoc.Load(filepath);
//得到team下的所有student节点.
XmlNodeList studentlist = xmlDoc.SelectSingleNode("team").ChildNodes; //遍历所有⼦节点
foreach (XmlElement student in studentlist)
{
XmlNode name = student.SelectSingleNode("name");
if (name.InnerText.Equals("Lili"))
{
name.InnerText = "Jack";
}
}
xmlDoc.Save(filepath);
}
}
移除XML节点
public void DeleteXml()
{
string filepath = "E:/my.xml";
if (File.Exists(filepath))
{
XmlDocument xmlDoc = new XmlDocument();
//根据路径将XML读取出来
xmlDoc.Load(filepath);
XmlNode team = xmlDoc.SelectSingleNode("team");
XmlNodeList studentlist = team.ChildNodes;
foreach(XmlNode student in studentlist)
{
XmlNode name = student.SelectSingleNode("name");
if(name.InnerText.Equals("Tom"))
{
python处理xml文件team.RemoveChild(student);
}
}
xmlDoc.Save(filepath);
}
}
xmlelement.RemoveAll()可以移除所有⼦节点
解析XML⽂件
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论