using System; using System.Collections; using System.Collections.Generic; using System.Runtime.Serialization; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; using UnityEngine; /// /// 解决原生字典无法被序列化XML的问题 /// /// /// [Serializable] public class XDictionary: Dictionary, IXmlSerializable, ISerializable { #region 构造函数 #region 默认构造函数 + public DictionaryEx() /// /// 默认构造函数 /// public XDictionary() : base() { } #endregion #region 构造函数 + public DictionaryEx(int capacity) /// /// 构造函数 /// /// 可包含的初始元素数 public XDictionary(int capacity) : base(capacity) { } #endregion #region 构造函数 + public DictionaryEx(IEqualityComparer comparer) /// /// 构造函数 /// /// 比较键时要使用的 比较器 实现,或者为 null,以便为键类型使用默认的 比较器 public XDictionary(IEqualityComparer comparer) : base(comparer) { } #endregion #region 构造函数 + public DictionaryEx(IDictionary dictionary) /// /// 构造函数 /// /// 初始数据 public XDictionary(IDictionary dictionary) : base(dictionary) { } #endregion #region 构造函数 + public DictionaryEx(int capacity, IEqualityComparer comparer) /// /// 构造函数 /// /// 可包含的初始元素数 /// 比较键时要使用的 比较器 实现,或者为 null,以便为键类型使用默认的 比较器 public XDictionary(int capacity, IEqualityComparer comparer) : base(capacity, comparer) { } #endregion #region 构造函数 + public DictionaryEx(IDictionary dictionary, IEqualityComparer comparer) /// /// 构造函数 /// /// 初始数据 /// 比较键时要使用的 比较器 实现,或者为 null,以便为键类型使用默认的 比较器 public XDictionary(IDictionary dictionary, IEqualityComparer comparer) : base(dictionary, comparer) { } #endregion //二进制反序列化构造函数 public XDictionary(SerializationInfo info, StreamingContext context):base(info, context) { } #endregion #region 取得概要 + public XmlSchema GetSchema() /// /// 取得概要 /// 注:根据MSDN的文档,此方法为保留方法,一定返回 null。 /// /// Xml概要 public XmlSchema GetSchema() { return null; } #endregion #region 从 XML 对象中反序列化生成本对象 + public void ReadXml(XmlReader reader) /// /// 从 XML 对象中反序列化生成本对象 /// /// 包含反序列化对象的 XmlReader 流 public void ReadXml(XmlReader reader) { XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); bool wasEmpty = reader.IsEmptyElement; reader.Read(); if (wasEmpty) return; while (reader.NodeType != XmlNodeType.EndElement) { reader.ReadStartElement("Item"); reader.ReadStartElement("Key"); TKey key = (TKey)keySerializer.Deserialize(reader); reader.ReadEndElement(); reader.ReadStartElement("Value"); TValue value = (TValue)valueSerializer.Deserialize(reader); reader.ReadEndElement(); this.Add(key, value); reader.ReadEndElement(); reader.MoveToContent(); } reader.ReadEndElement(); } #endregion #region 将本对象序列化为 XML 对象 + public void WriteXml(XmlWriter writer) /// /// 将本对象序列化为 XML 对象 /// /// 待写入的 XmlWriter 对象 public void WriteXml(XmlWriter writer) { XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); foreach (TKey key in this.Keys) { writer.WriteStartElement("Item"); writer.WriteStartElement("Key"); keySerializer.Serialize(writer, key); writer.WriteEndElement(); writer.WriteStartElement("Value"); TValue value = this[key]; valueSerializer.Serialize(writer, value); writer.WriteEndElement(); writer.WriteEndElement(); } } #endregion }