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)的更多相关文章

  1. Android(java)学习笔记185:xml文件生成

    1.xml文件: 用元素描述数据,跨平台. 2.利用传统的方式创建xml文件,下面是一个案例: 设计思路:建立一个学生管理系统,创建xml文件保存学生信息: (1)首先是布局文件activity_ma ...

  2. Android(java)学习笔记128:xml文件生成

    1.xml文件: 用元素描述数据,跨平台. 2.利用传统的方式创建xml文件,下面是一个案例: 设计思路:建立一个学生管理系统,创建xml文件保存学生信息: (1)首先是布局文件activity_ma ...

  3. Android学习笔记(9):使用XML文件和Java代码控制UI界面

    Android推荐使用XML文件设置UI界面.然后用Java代码控制逻辑部分,这体现了MVC思想. MVC全名是Model View Controller.是模型(model)-视图(view)-控制 ...

  4. Android学习笔记之AndroidManifest.xml文件解析(转)

    //自已备注: <?xml version="1.0" encoding="utf-8"?>//说明了版本号,字符集 <manifest xm ...

  5. Android学习笔记之AndroidManifest.xml文件解析

    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...

  6. Android学习笔记之AndroidManifest.xml文件解析(详解)

    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...

  7. Excel开发学习笔记:读取xml文件及csv文件

    遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵. ).Split(  ...

  8. 八、Android学习第七天——XML文件解析方法(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...

  9. php添加数据到xml文件的例子

    php添加数据到xml文件中 时间:2015-12-17 06:30:37来源:网络 导读:php添加数据到xml文件中   xml文件:stu.xml: 复制代码代码如下: <?xml ver ...

  10. Java NIO 学习笔记(四)----文件通道和网络通道

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

随机推荐

  1. STM32中SWD下载不进去的解决方法

    这是我第一次写自己的博客,希望以后写博客可以当做自己的个人习惯并坚持下去,作为技术分享,也欢迎各位大佬前来指正.本人本科学习的机械电子工程,了解机械制图.嵌入式编程.目前刚好学习了PCB制板,正在向着 ...

  2. Web通用漏洞--sql注入

    SQL注入 mysql注入目的:获取当前web权限 mysql注入--常规查询&union联合查询 MYSQL--Web组成架构 服务器搭建web服务可能存在多个站点搭建在一台服务器中,数据集 ...

  3. 《SQL与数据库基础》09. 事务

    @ 目录 事务 简介 操作 方式一 方式二 四大特性(ACID) 并发事务问题 事务隔离级别 本文以 MySQL 为例 事务 简介 事务是一组操作的集合,它是一个不可分割的工作单位.事务会把所有的操作 ...

  4. vue3+ts Axios封装—重复请求拦截

    创建好vue3项目 1.安装Axios与Element Plus Axios安装 npm install axios Element Plus 安装 官网入口:https://element-plus ...

  5. SQL简单使用指南

    SQL简单使用指南 SQL(结构化查询语言)是一种用于管理和操作关系型数据库的标准化语言. 数据库概述 数据库是用于存储和组织数据的结构.它由表(表格)组成,每个表都包含多个列和行.以下是SQL中最常 ...

  6. 图解 LeetCode 算法汇总——链表

    本文首发公众号:小码A梦 一般数据主要存储的形式主要有两种,一种是数组,一种是链表.数组是用来存储固定大小的同类型元素,存储在内存中是一片连续的空间.而链表就不同于数组.链表中的元素不是存储在内存中可 ...

  7. UM 百度富文本编辑器上传报错

    看下报错信息 这三张图记录了当时,上传图片 遇见的报错信息 最终解决方案 我把UM下jsp文件下的ueditor-mini.jar包拷贝到WEB_INF下的lib文件夹下,就成功了. maven的话把 ...

  8. c语言代码练习4(改进)

    #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <wi ...

  9. linux日常维护(二)

    linux启动流程 BIOS自检 启动GRUB 2 加载内核 执行systemd进程 初始化系统环境 执行/bin/login程序 (一)BIOS自检 加电POST自检(对硬件进行检测) 进行本地设备 ...

  10. 我们又组织了一次欧洲最大开源社区活动,Hugging Face 博客欢迎社区成员发帖、Hugging Chat 功能更新!

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...