Unity学习笔记--数据持久化XML文件(2)
IXmlSerializable接口:
使用该接口可以帮助处理不能被序列化和反序列化的特殊类得到处理,
使特殊类继承IXmlSerializable接口 ,实现其中的读写方法,检测到读写方法被重写之后,
便会按照自定义实现的接口来实现方法。
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
using UnityEngine;
namespace Building.XML
{
/// <summary>
/// 要存储的类 实现IXMLSerializer接口
/// </summary>
public class Test03:IXmlSerializable
{
public int testInt;
public string testName;
public int age;
public XmlSchema GetSchema()
{
return null;
}
/// <summary>
/// 在进行读操作 反序列化时候调用的方法
/// </summary>
/// <param name="reader"></param>
public void ReadXml(XmlReader reader)
{
//读XML文件
//001 读属性
testInt = int.Parse(reader["testInt"]);
testName = reader["testName"];
//002 读节点
//单个读
reader.Read();//读节点名称
reader.Read();//读节点中内容
//获取内容数值
testInt = int.Parse(reader.Value);
reader.Read();//读结尾
//读下一个开始
reader.Read();
reader.Read();
testName = reader.Value;
reader.Read();
//或者循环读
//=====进行读 对应这要读取的XML文件
/*while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "testInt":
reader.Read();
testInt = int.Parse(reader.Value);
break;
case "testName":
reader.Read();
testName = reader.Value;
break;
case "testAge":
reader.Read();
age = int.Parse(reader.Value);
break;
}
}
}
*/
reader.Read();
reader.Read();
age = int.Parse(reader.Value);
reader.Read();
//003 读取包裹的元素节点
XmlSerializer xmlSerializerInt = new XmlSerializer(typeof(int));
XmlSerializer xmlSerializerString = new XmlSerializer(typeof(string));
//跳过根节点--默认read停留在开始
reader.Read();
//读包裹开始
reader.ReadStartElement("BlogName");
//读包裹内容
testName = xmlSerializerString.Deserialize(reader).ToString();
reader.ReadEndElement();//读取包裹结束
reader.ReadStartElement("Age");
age = (int)xmlSerializerInt.Deserialize(reader);
reader.ReadEndElement();
}
/// <summary>
/// 在进行写操作 序列化时候调用的方法
/// </summary>
/// <param name="writer"></param>
/// <exception cref="NotImplementedException"></exception>
public void WriteXml(XmlWriter writer)
{
// 向XML文件中写内容
//1 写属性
writer.WriteAttributeString("testInt",testInt.ToString());
writer.WriteAttributeString("testName",testName);
//2 写节点
writer.WriteElementString("testInt",this.testInt.ToString());
testName = "TonyChang";
age = 21;
writer.WriteElementString("testName",testName);
writer.WriteElementString("testAge",age.ToString());
//3.写包裹的节点
XmlSerializer serializerInt = new XmlSerializer(typeof(int));
XmlSerializer serializerString = new XmlSerializer(typeof(string));
writer.WriteStartElement("BlogName");//开始包裹
serializerString.Serialize(writer,testName);//包裹中内容 序列化放到写入流中
writer.WriteEndElement();//结束包裹
writer.WriteStartElement("Age");
serializerInt.Serialize(writer,age);
writer.WriteEndElement();//结束包裹
}
}
public class XMLDemo2:MonoBehaviour
{
private void Start()
{
//采用默认方式(上文中提到的)进行序列化与反序列化
string path = Application.persistentDataPath + "/XMLDemo02.xml";
Test03 test03 = new Test03();
print(path);//打印存储路径
using (StreamWriter streamWriter=new StreamWriter(path))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Test03));
xmlSerializer.Serialize(streamWriter,test03);
}
//反序列化
if (File.Exists(path))
{
using (StreamReader streamReader=new StreamReader(path))
{
XmlSerializer xmlSerializerRead = new XmlSerializer(typeof(Test03));
Test03 test03Read = xmlSerializerRead.Deserialize(streamReader) as Test03;
print(test03.testName);
print(test03Read.age);
}
}
}
}
}

存储的XML的文件样式(注意对照XML存储样式来理解读取和存储的代码)
特别注意在代码中的读取包裹节点时候先要跳过“根节点”,code Line81;
自定义实现支持序列化与反序列化的字典
using System.Collections.Generic;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
namespace Building.XML.SerializerDic
{
/// <summary>
/// 支持序列化与反序列化的字典
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
public class SerializerDictionary<TKey,TValue>:Dictionary<TKey,TValue>,IXmlSerializable
{
public XmlSchema GetSchema()
{
return null;
}
/// <summary>
/// 反序列化 读取XML文件调用
/// </summary>
/// <param name="reader"></param>
/// <exception cref="NotImplementedException"></exception>
public void ReadXml(XmlReader reader)
{
//新建写入器 反序列化工具
XmlSerializer xmlSerializerKey = new XmlSerializer(typeof(TKey));
XmlSerializer xmlSerializerValue = new XmlSerializer(typeof(TValue));
//跳过根节点
reader.Read();
while (reader.NodeType!=XmlNodeType.EndElement)
{
TKey tk = (TKey)xmlSerializerKey.Deserialize(reader);
TValue tv = (TValue) xmlSerializerValue.Deserialize(reader);
this.Add(tk,tv);//添加到容器中
}
}
/// <summary>
/// 序列化 写入XML文件时候调用
/// </summary>
/// <param name="writer"></param>
/// <exception cref="NotImplementedException"></exception>
public void WriteXml(XmlWriter writer)
{
//新建写入器 序列化工具
XmlSerializer xmlSerializerKey = new XmlSerializer(typeof(TKey));
XmlSerializer xmlSerializerValue = new XmlSerializer(typeof(TValue));
foreach (KeyValuePair<TKey,TValue> kv in this)
{
xmlSerializerKey.Serialize(writer,kv.Key);
xmlSerializerValue.Serialize(writer,kv.Value);
}
}
}
}
测试代码:
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
using UnityEngine;
namespace Building.XML.SerializerDic
{
public class Test4
{
public int num = 4;
public SerializerDictionary<int, string> sDic;
}
public class XMLDemo3:MonoBehaviour
{
private void Start()
{
string path = Application.persistentDataPath + "/XMLDemo4.xml";
print(path);
Test4 test4 = new Test4();
test4.sDic = new SerializerDictionary<int, string>() {{1, "Tony"}, {2, "Tom"}, {3, "Frank"}};
using (StreamWriter streamWriter=new StreamWriter(path))
{
XmlSerializer xmlSerializerWrite = new XmlSerializer(typeof(Test4));
xmlSerializerWrite.Serialize(streamWriter,test4);
}
//进行反序列化读取
if (File.Exists(path))
{
using (StreamReader streamReader=new StreamReader(path))
{
XmlSerializer xmlSerializerRead = new XmlSerializer(typeof(Test4));
Test4 test4Read=xmlSerializerRead.Deserialize(streamReader) as Test4;
foreach (KeyValuePair<int,string> pair in test4Read.sDic)
{
Debug.Log("key:"+pair.Key+",Value:"+pair.Value);
}
}
}
}
}
}
存储生成的XML文件内容:

XML存储工具类:
using System;
using System.IO;
using System.Xml.Serialization;
using UnityEngine;
namespace Building.XML.SerializerDic
{
public class XMLSerializerManager
{
private static XMLSerializerManager instance=new XMLSerializerManager();
public static XMLSerializerManager Instance=>instance;
private XMLSerializerManager()
{
}
/// <summary>
/// 存储文件
/// </summary>
/// <param name="data">数据内容</param>
/// <param name="FileName">存储文件名称</param>
public void SaveData(object data, string FileName)
{
string path = Application.persistentDataPath + "/" + FileName + ".xml";
using (StreamWriter streamWriter=new StreamWriter(path))
{
XmlSerializer xmlSerializerWriter = new XmlSerializer(data.GetType());
xmlSerializerWriter.Serialize(streamWriter,data);
}
}
public object LodaData(Type type,string FileName)
{
string path = Application.persistentDataPath + "/" + FileName + ".xml";
if (!File.Exists(path))
{
path = Application.streamingAssetsPath + "/" + FileName + ".xml";
if (!File.Exists(path))
{
//如果在持续存储文件夹下未发现 并且在 流文件夹中仍旧未发现
//则利用反射返回一个该类型的实例 其中的数据为默认值
return Activator.CreateInstance(type);
}
}
using (StreamReader streamReader=new StreamReader(path))
{
XmlSerializer xmlSerializerReader = new XmlSerializer(type);
return xmlSerializerReader.Deserialize(streamReader);
}
}
}
}
Unity学习笔记--数据持久化XML文件(2)的更多相关文章
- Android(java)学习笔记185:xml文件生成
1.xml文件: 用元素描述数据,跨平台. 2.利用传统的方式创建xml文件,下面是一个案例: 设计思路:建立一个学生管理系统,创建xml文件保存学生信息: (1)首先是布局文件activity_ma ...
- Android(java)学习笔记128:xml文件生成
1.xml文件: 用元素描述数据,跨平台. 2.利用传统的方式创建xml文件,下面是一个案例: 设计思路:建立一个学生管理系统,创建xml文件保存学生信息: (1)首先是布局文件activity_ma ...
- Android学习笔记(9):使用XML文件和Java代码控制UI界面
Android推荐使用XML文件设置UI界面.然后用Java代码控制逻辑部分,这体现了MVC思想. MVC全名是Model View Controller.是模型(model)-视图(view)-控制 ...
- Android学习笔记之AndroidManifest.xml文件解析(转)
//自已备注: <?xml version="1.0" encoding="utf-8"?>//说明了版本号,字符集 <manifest xm ...
- Android学习笔记之AndroidManifest.xml文件解析
一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...
- Android学习笔记之AndroidManifest.xml文件解析(详解)
一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...
- Excel开发学习笔记:读取xml文件及csv文件
遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵. ).Split( ...
- 八、Android学习第七天——XML文件解析方法(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...
- php添加数据到xml文件的例子
php添加数据到xml文件中 时间:2015-12-17 06:30:37来源:网络 导读:php添加数据到xml文件中 xml文件:stu.xml: 复制代码代码如下: <?xml ver ...
- Java NIO 学习笔记(四)----文件通道和网络通道
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
随机推荐
- 熟悉又陌生的package.json
前言 随着前端的不断发展,package.json可谓是在前端项目中无处不在,它不仅在项目根目录会有,而且在 node_modules 中也存在.那么这个文件到底是干嘛的,又有什么作用?很多人对它的认 ...
- 概率dp_C++详解
引入 概率 DP 用于解决概率问题与期望问题,建议先对概率和期望的内容有一定了解.一般情况下,解决概率问题需要顺序循环,而解决期望问题使用逆序循环,如果定义的状态转移方程存在后效性问题,还需要用到 高 ...
- VMware三种连接模式的区别
安装了vm软件后,该软件会虚拟出两张虚拟网卡vmnet1和vmnet8 网卡在控制面板->网络和internet->更改适配器设置 三种网络连接模式: 桥接模式:使用主机的无线网卡或者有线 ...
- LeetCode 周赛上分之旅 #39 结合中心扩展的单调栈贪心问题
️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...
- 4、Mybatis核心配置文件详解
4.1.environments <!-- environments标签:配置多个连接数据库的环境 default属性:设置默认使用的环境的id --> <environments ...
- 《Linux基础》05. 定时任务调度 · 磁盘分区与挂载 · 网络配置
@ 目录 1:定时任务调度 1.1:crontab 1.2:at 2:磁盘分区与挂载 2.1:原理介绍 2.2:硬盘说明 2.3:磁盘目录情况查询 2.3.1:lsblk 2.3.2:df 2.3.3 ...
- DHorse v1.3.2 发布,基于 k8s 的发布平台
版本说明 新增特性 构建版本.部署应用时的线程池可配置化: 优化特性 构建版本跳过单元测试: 解决问题 解决Vue应用详情页面报错的问题: 解决Linux环境下脚本运行失败的问题: 解决下载Maven ...
- 产品代码都给你看了,可别再说不会DDD(五):请求处理流程
这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...
- QA|20211013|SecureCRT:如图,有很多^,中文显示有问题,乱码,如何解决
Q1:如图,有很多^,中文显示有问题,乱码,如何解决 Q2:securecrt的vi展示有问题:少很多字.有很多^M和^,光标无法移动到最右侧 A: 首先检查当前编码格式: 1 echo $LANG ...
- 超全技术学习资料PDF分享
技术学习资料分享,目前共20G,持续更新... Java学习资料: 大数据Hadoop: 这里不一一截图了,资源持续更新中. 关注下面公众号进行下载.