VB.NET
Imports System
Imports System.Collections.Generic
Imports System.Runtime.Serialization
Imports System.Xml
Imports System.Xml.Schema
Imports System.Xml.Serialization
''' <summary>
''' 支持XML序列化的字典
''' </summary>
Public Class SerializableDictionary(Of TKey, TValue)
Inherits Dictionary(Of TKey, TValue)
Implements IXmlSerializable
#Region "Create"
Sub New()
MyBase.New()
End Sub
Public Sub New(ByVal dictionary As IDictionary(Of TKey, TValue))
MyBase.New(dictionary)
End Sub
Public Sub New(ByVal comparer As IEqualityComparer(Of TKey))
MyBase.New(comparer)
End Sub
Public Sub New(ByVal capacity As Integer)
MyBase.New(capacity)
End Sub
Public Sub New(ByVal capacity As Integer, ByVal comparer As IEqualityComparer(Of TKey))
MyBase.New(capacity, comparer)
End Sub
Protected Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
MyBase.New(info, context)
End Sub
#End Region
#Region "IXmlSerializable"
Public Function GetSchema() As XmlSchema Implements IXmlSerializable.GetSchema
Return Nothing
End Function
Public Sub ReadXml(ByVal reader As XmlReader) Implements IXmlSerializable.ReadXml
Dim keySerializer As New XmlSerializer(GetType(TKey))
Dim valueSerializer As New XmlSerializer(GetType(TValue))
Dim wasEmpty As Boolean = reader.IsEmptyElement
reader.Read()
If wasEmpty Then Return
While reader.NodeType <> XmlNodeType.EndElement
reader.ReadStartElement("Key")
Dim key As TKey = CType(keySerializer.Deserialize(reader), TKey)
reader.ReadEndElement()
reader.ReadStartElement("Value")
Dim value As TValue = CType(valueSerializer.Deserialize(reader), TValue)
reader.ReadEndElement()
Me.Add(key, value)
reader.MoveToContent()
End While
reader.ReadEndElement()
End Sub
Public Sub WriteXml(ByVal writer As XmlWriter) Implements IXmlSerializable.WriteXml
Dim keySerializer As XmlSerializer = New XmlSerializer(GetType(TKey))
Dim valueSerializer As XmlSerializer = New XmlSerializer(GetType(TValue))
For Each key As TKey In Me.Keys
writer.WriteStartElement("Key")
keySerializer.Serialize(writer, key)
writer.WriteEndElement()
writer.WriteStartElement("Value")
Dim value As TValue = Me(key)
valueSerializer.Serialize(writer, value)
writer.WriteEndElement()
Next
End Sub
#End Region
End Class
C#
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
namespace Lmsoft.Collections.Generic
{
/// <summary>
/// 支持XML序列化的泛型Dictionary类
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
[XmlRoot("Dictionary")]
public class SerializableDictionary<TKey, TValue>
: Dictionary<TKey, TValue>, IXmlSerializable
{
#region 构造函数,调用基类的构造函数
public SerializableDictionary() : base()
{
}
public SerializableDictionary(IDictionary<TKey, TValue> dictionary) : base(dictionary)
{
}
public SerializableDictionary(IEqualityComparer<TKey> comparer) : base(comparer)
{
}
public SerializableDictionary(int capacity) : base(capacity)
{
}
public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)
: base(capacity, comparer)
{
}
protected SerializableDictionary(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
#endregion
#region IXmlSerializable 接口的实现
public XmlSchema GetSchema()
{
throw new NotImplementedException();
}
/// <summary>
/// 从对象的XML表示形式生成该对象
/// </summary>
/// <param name="reader"></param>
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("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.MoveToContent();
}
reader.ReadEndElement();
}
/// <summary>
/// 将对象转换为其XML表示形式
/// </summary>
/// <param name="writer"></param>
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("Key");
keySerializer.Serialize(writer, key);
writer.WriteEndElement();
writer.WriteStartElement("Value");
TValue value = this[key];
valueSerializer.Serialize(writer, value);
writer.WriteEndElement();
}
}
#endregion
}
}