[XmlElement("XXX")]修改结点的名字
[XmlAttribute("Test1")]变成特征,修改结点的名字
[XmlArray("IntList")]修改数组结点的名字
[XmlArrayItem("Int32")]修改数组内结点的名字
IXmlSerializable:WriteXml 自定义序列化 ReadXml 自定义反序列化
实现自定义类的序列化(一般不怎么用)[3种基本写法]
数据持久化-XML之IXmlSerializable自定义序列化(3) - 知乎 (zhihu.com)
以下两个脚本是由 B站唐老狮 书写,非本人。
XmlDataMgr.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
using UnityEngine;
public class XmlDataMgr
{
private static XmlDataMgr instance = new XmlDataMgr();
public static XmlDataMgr Instance => instance;
private XmlDataMgr() { }
/// <summary>
/// 保存数据到xml文件中
/// </summary>
/// <param name="data">数据对象</param>
/// <param name="fileName">文件名</param>
public void SaveData(object data, string fileName)
{
//1.得到存储路径
string path = Application.persistentDataPath + "/" + fileName + ".xml";
//2.存储文件
using(StreamWriter writer = new StreamWriter(path))
{
//3.序列化
XmlSerializer s = new XmlSerializer(data.GetType());
s.Serialize(writer, data);
}
}
/// <summary>
/// 从xml文件中读取内容
/// </summary>
/// <param name="type">对象类型</param>
/// <param name="fileName">文件名</param>
/// <returns></returns>
public object LoadData(Type type, string fileName)
{
//1。首先要判断文件是否存在
string path = Application.persistentDataPath + "/" + fileName + ".xml";
if( !File.Exists(path) )
{
path = Application.streamingAssetsPath + "/" + fileName + ".xml";
if (!File.Exists(path))
{
//如果根本不存在文件 两个路径都找过了
//那么直接new 一个对象 返回给外部 无非 里面都是默认值
return Activator.CreateInstance(type);
}
}
//2.存在就读取
using (StreamReader reader = new StreamReader(path))
{
//3.反序列化 取出数据
XmlSerializer s = new XmlSerializer(type);
return s.Deserialize(reader);
}
}
}
SerizlizerDictionary.cs
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
using UnityEngine;
public class SerizlizerDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
{
public XmlSchema GetSchema()
{
return null;
}
//自定义字典的 反序列化 规则
public void ReadXml(XmlReader reader)
{
XmlSerializer keySer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSer = new XmlSerializer(typeof(TValue));
//要跳过根节点
reader.Read();
//判断 当前不是元素节点 结束 就进行 反序列化
while (reader.NodeType != XmlNodeType.EndElement)
{
//反序列化键
TKey key = (TKey)keySer.Deserialize(reader);
//反序列化值
TValue value = (TValue)valueSer.Deserialize(reader);
//存储到字典中
this.Add(key, value);
}
reader.Read();
}
//自定义 字典的 序列化 规则
public void WriteXml(XmlWriter writer)
{
XmlSerializer keySer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSer = new XmlSerializer(typeof(TValue));
foreach (KeyValuePair<TKey, TValue> kv in this)
{
//键值对 的序列化
keySer.Serialize(writer, kv.Key);
valueSer.Serialize(writer, kv.Value);
}
}
}