2011-09-14 17 views
6

Ho implementato la modalità stato sessione sqlserver e quando eseguo la mia applicazione sono di fronte errore di serializzazione XML della tabella hash. e la mia classe si presenta come:come serializzare hashtable in C#

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

    public System.Collections.Hashtable ConfigTable 
     { 
      get { return _ConfigTable; } 
     } 

} 

ora voglio sapere come serializzare la hastable o se c'è un'altra alternativa per favore fatemelo sapere.

ed esattamente errore: "Impossibile serializzare membro ProjectSetup.ConfigTable di tipo System.Collections.Hashtable, perché implementa IDictionary"

+0

Sostituire Hashtable con ArrayList mentre la serializzazione –

+0

Comunque, se ho ottenuto il vostro idea di stato della sessione, contiene pars di tipo stringa: chiave, valore, ho ragione? –

+1

btw, se crei un account registrato (completamente gratuito ecc.) Non continuerai a perdere tutte le tue domande nel vuoto –

risposta

0

Un modo è quello di implementare IXmlSerializable sulla vostra classe e serializzare la tabella hash manualmente. Vedi this article per maggiori dettagli.

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

Questo non funzionerebbe per nessuna classe, che non è derivata da BizEntity, quindi, in comune, che wouldn funziona –

+0

ok quando implemento IXmlSerializable quindi crea xml solo per l'attributo hastable ma voglio che l'intera classe sia serializzata. – Anil

+0

@Anil: Sostituisci le raccolte non serializzate con quelle serializzate, come mostrato sotto –

0

utilizzare la serializzazione personalizzato utilizzando implementazione di interfaccia ICollection, e segnare Hashtable come [NonSerialized], invece, utilizzare la raccolta personalizzato anziché Hashtable o utilizzare internamente, per la raccolta di elementi, come in questo esempio:

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

serializzazione di dizionari è ben descritto qui-: 0.123.882,893109 millions.

dizionari Comunque la serializzazione JSON sembra una scelta più naturale in modo da considerare l'utilizzo di librerie di serializzazione JSON