как сериализовать хэш-таблицу в C # - PullRequest
6 голосов
/ 14 сентября 2011

Я реализовал режим состояния сеанса sqlserver, и когда я запускаю свое приложение, я сталкиваюсь с ошибкой сериализации XML хеш-таблицы. и мой класс выглядит так:

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

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

}

Теперь я хочу знать, как сериализовать hastable или, если есть другая альтернатива, пожалуйста, дайте мне знать.

и именно ошибка: «Невозможно сериализовать элемент ProjectSetup.ConfigTable типа System.Collections.Hashtable, поскольку он реализует IDictionary»

Ответы [ 4 ]

1 голос
/ 14 сентября 2011
0 голосов
/ 14 сентября 2011

Сериализующие словари хорошо описаны здесь: http://weblogs.asp.net/avnerk/archive/2006/05/23/Serilalizing-Dictionaries.aspx.

В любом случае сериализация словарей в JSON кажется более естественным выбором, поэтому рассмотрите возможность использования библиотек сериализации JSON

0 голосов
/ 14 сентября 2011

Используйте пользовательскую сериализацию с использованием реализации интерфейса 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;
      }
  }
0 голосов
/ 14 сентября 2011

Один из способов - реализовать 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);
    }
}
...