Files
DP44/DataPRO/IService/SerializableDictionary.cs
2026-04-17 14:55:32 -04:00

88 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
namespace DTS.DASLib.Service
{
/// <summary>
/// This is a simple serializable dictionary
/// I'm using it for storing user attributes on slicepro/1.5 right now, but it's probably suitable for any dictionary
/// that needs to be serialized
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
[XmlRoot("SerializedDictionary")]
public class SerializableDictionary<TKey, TValue>
: Dictionary<TKey, TValue>, IXmlSerializable
{
#region IXmlSerializable Members
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
bool wasEmpty = reader.IsEmptyElement;
if (wasEmpty)
return;
reader.Read();//document
reader.ReadStartElement();//serializeddictionary
while (reader.NodeType != System.Xml.XmlNodeType.EndElement && reader.NodeType != System.Xml.XmlNodeType.None)
{
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();
}
if (reader.NodeType != System.Xml.XmlNodeType.None)
{
reader.ReadEndElement();
}
}
public void WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteStartDocument();
XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
writer.WriteStartElement("SerializedDictionary");
foreach (TKey key in this.Keys)
{
writer.WriteStartElement("Item");
writer.WriteStartElement("Key");
keySerializer.Serialize(writer, key);
writer.WriteEndElement();//key
writer.WriteStartElement("Value");
TValue value = this[key];
valueSerializer.Serialize(writer, value);
writer.WriteEndElement();//value
writer.WriteEndElement();//item
writer.Flush();
}
writer.WriteEndElement();//SerializedDictionary
writer.WriteEndDocument();
}
#endregion
}
}