How to serialize a hash table in C #

I implemented the sqlserver mode of the session state, and when I run my application, I encountered an XML hash table serialization error. and my class is as follows:

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

Now I want to know how to serialize a hastable or if there is another alternative, please let me know.

and exactly the error: "It is not possible to serialize a ProjectSetup.ConfigTable element of type System.Collections.Hashtable because it implements IDictionary"

+6
source share
4 answers

One way is to implement IXmlSerializable in your class and serialize the hash table manually. See this article for more details.

 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); } } 
0
source

Use custom serialization using the implementation of the ICollection interface and mark Hashtable as [NonSerialized], instead use a custom collection instead of Hashtable or use it inside to collect elements, as in this example:

  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; } } 
0
source

Serialization dictionaries are well described here: http://weblogs.asp.net/avnerk/archive/2006/05/23/Serilalizing-Dictionaries.aspx .

In any case, serializing dictionaries in JSON seems like a more natural choice, so consider using JSON serialization libraries

0
source

Source: https://habr.com/ru/post/897302/


All Articles