here is a somewhat working solution (for reference
http://www.mattberther.com/2004/06/000487.html)
using System;
using System.Xml;
using System.IO;
using System.Xml.Seri alization;
using System.Collecti ons;
namespace Utils
{
public class XmlSerializable Hashtable : IXmlSerializabl e, IEnumerable
{
private Hashtable _table;
public XmlSerializable Hashtable()
{
this._table = new Hashtable();
}
private XmlSerializable Hashtable(Hasht able table)
{
this._table = table;
}
void IXmlSerializabl e.ReadXml(XmlRe ader reader)
{
reader.Read();
while (reader.NodeTyp e != XmlNodeType.End Element)
{
reader.ReadStar tElement("item" );
string key = reader.ReadElem entString("key" );
string value = reader.ReadElem entString("valu e");
reader.ReadEndE lement();
reader.MoveToCo ntent();
_table.Add(key, value);
}
}
void IXmlSerializabl e.WriteXml(XmlW riter writer)
{
foreach (object key in _table.Keys)
{
object value = _table[key];
writer.WriteSta rtElement("item ");
writer.WriteEle mentString("key ", key.ToString()) ;
writer.WriteEle mentString("val ue", value.ToString( ));
writer.WriteEnd Element();
}
}
System.Xml.Sche ma.XmlSchema IXmlSerializabl e.GetSchema()
{
return null;
}
public void Add(object key, object value)
{
_table.Add(key, value);
}
public void Remove(object key)
{
_table.Remove(k ey);
}
public void Clear()
{
_table.Clear();
}
public int Count
{
get { return _table.Count; }
}
public object this[object key]
{
get { return _table[key]; }
set { _table[key] = value; }
}
public ICollection Keys
{
get { return _table.Keys; }
}
public ICollection Values
{
get { return _table.Values; }
}
public bool ContainsKey(obj ect key)
{
return _table.Contains Key(key);
}
public bool ContainsValue(o bject key)
{
return _table.Contains Value(key);
}
public bool Contains(object key)
{
return _table.Contains (key);
}
/// <summary> returns a shallow copy of the XmlSerializable Hashtable</summary>
public object Clone()
{
return new XmlSerializable Hashtable(_tabl e.Clone() as Hashtable);
}
public IEnumerator GetEnumerator()
{
return new Enumerator(_tab le.GetEnumerato r());
}
private class Enumerator : IEnumerator
{
private IEnumerator inner = null;
public Enumerator(IEnu merator inner)
{
this.inner = inner;
}
public void Reset()
{
inner.Reset();
}
public object Current
{
get { return ((DictionaryEnt ry) inner.Current). Value; }
}
public bool MoveNext()
{
return inner.MoveNext( );
}
}
}
}
Ivan wrote:
is it possible to make a universal hashtable that would be able to
serialize itself to xml format?
universal one, meaning I don't have to know about the type of keys and
values in advance.
Ivan