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
}