如何在c#中序列化哈希表

我已经实现了会话状态模式sqlserver,当我运行我的应用程序时,我面临着哈希表的XML序列化错误。 我的class级看起来像:

[Serializable] public class ProjectSetup{ private System.Collections.Hashtable _ConfigTable; //and other properties here public System.Collections.Hashtable ConfigTable { get { return _ConfigTable; } } } 

现在我想知道如何序列化hastable,或者如果有其他选择请告诉我。

并且确切的错误是:“无法序列化System.Collections.Hashtable类型的成员ProjectSetup.ConfigTable,因为它实现了IDictionary”

一种方法是在类上实现IXmlSerializable并手动序列化哈希表。 有关详细信息,请参阅此文章 。

 public void WriteXml(System.Xml.XmlWriter writer) { // Used while Serialization // Serialize each BizEntity this collection holds foreach( string key in this.Dictionary.Keys ) { Serializer.Serialize(writer, this.Dictionary[key]); } } public void ReadXml(System.Xml.XmlReader reader) { // Used while Deserialization // Move past container reader.Read(); // Deserialize and add the BizEntitiy objects while( reader.NodeType != XmlNodeType.EndElement ) { BizEntity entity; entity = Serializer.Deserialize(reader) as BizEntity; reader.MoveToContent(); this.Dictionary.Add(entity.Key, entity); } } 

序列化词典在这里有详细描述: http : //weblogs.asp.net/avnerk/archive/2006/05/23/Serilalizing-Dictionaries.aspx 。

无论如何将字典序列化为JSON似乎是一个更自然的选择,所以考虑使用JSON序列化库

使用ICollection接口实现使用自定义序列化,并将Hashtable标记为[NonSerialized],而是使用自定义集合而不是Hashtable或在内部使用它来收集元素,如下例所示:

  using System; using System.IO; using System.Collections; using System.Xml.Serialization; public class Test{ static void Main(){ Test t = new Test(); t.SerializeCollection("coll.xml"); } private void SerializeCollection(string filename){ Employees Emps = new Employees(); // Note that only the collection is serialized -- not the // CollectionName or any other public property of the class. Emps.CollectionName = "Employees"; Employee John100 = new Employee("John", "100xxx"); Emps.Add(John100); XmlSerializer x = new XmlSerializer(typeof(Employees)); TextWriter writer = new StreamWriter(filename); x.Serialize(writer, Emps); } } public class Employees:ICollection{ public string CollectionName; private ArrayList empArray = new ArrayList(); public Employee this[int index]{ get{return (Employee) empArray[index];} } public void CopyTo(Array a, int index){ empArray.CopyTo(a, index); } public int Count{ get{return empArray.Count;} } public object SyncRoot{ get{return this;} } public bool IsSynchronized{ get{return false;} } public IEnumerator GetEnumerator(){ return empArray.GetEnumerator(); } public void Add(Employee newEmployee){ empArray.Add(newEmployee); } } public class Employee{ public string EmpName; public string EmpID; public Employee(){} public Employee(string empName, string empID){ EmpName = empName; EmpID = empID; } }