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 ...
随机推荐
- 调试linux内核(1): 环境准备和原理介绍
开篇 现在流行的开源项目经历了长时间的开发, 积累了大量的代码, 想要一行一行地阅读代码去学习开源项目, 需要的时间成本是巨大的. 所以, 我们也需要用一种高效的方式去"阅读"代码 ...
- 从源码角度了解Vue生命周期
每个Vue应用都是通过new Vue()创建一个Vue实例开始.Vue()函数可以传入选项Options,常见的有el.template和data选项等. el 只在new创建实例时生效,其值可以是一 ...
- CVE-2023-2825-GitLab目录穿越poc
Gitlab CVE-2023-2825 目录穿越漏洞 前言 昨天 GitLab 出了一个版本目录穿越漏洞(CVE-2023-2825),可以任意读取文件.当时我进行了黑盒测试并复现了该漏洞. &qu ...
- 从原理聊 JVM(五):JVM 的编译过程和优化手段
一.前端编译 前端编译就是将Java源码文件编译成Class文件的过程,编译过程分为4步: 1 准备 初始化插入式注解处理器(Annotation Processing Tool). 2 解析与填充符 ...
- wget 命令的使用:HTTP文件下载、FTP文件下载--九五小庞
1. wget 命令简介与安装wget是用于在命令行终端下载网络文件的开源免费的命令工具,支持 HTTP/HTTPS.FTP/FTPS 协议的下载.wget 与 curl 相似,curl 可以理解为是 ...
- 云原生 | 企业内使用 CoreDNS 构建高性能、插件化的DNS服务器
[点击 关注「 全栈工程师修炼指南」公众号 ] 设为「️ 星标」带你从基础入门 到 全栈实践 再到 放弃学习! 涉及 网络安全运维.应用开发.物联网IOT.学习路径 .个人感悟 等知识分享. 希望各位 ...
- windows无法连接VMware虚拟机的linux
遇到的问题:今天使用xshell连接虚拟机,无法连接. 解决过程: 1.测试ping, linux虚拟机能ping通windows主机,可是windows主机ping不通linux虚拟机. 2.查看v ...
- ZooKeeper核心概念和架构
ZooKeeper简介 ZooKeeper是一个分布式应用程序协调服务,主要用于解决分布式集群中应用系统的一致性问题.它能提供类似文件系统的目录节点树方式的数据存储,主要用途是维护和监控所存数据的状态 ...
- Vue element-ui 动态生成自定义table表头实现数据渲染
需求:1)表头的数据是动态的,有可能字段值很长且很多.解决方案自定义动态表头,字段长使用文字提示[el-tooltip组件]: 2)需要对表格data中的数据值进行枚举转成中文值,且显示不同的颜色. ...
- 拟合优度R2较低怎么办
拟合优度R2较低怎么办 (1)回归分为解释型回归和预测型回归. 预测型回归一般才会更看重2. 解释型回归更多的关注模型整体显著性以及自变量的统计显著性和经济意义显著 性即可. (2)可以对模型进行调整 ...