понедельник, 3 сентября 2007 г.

Xml-сериализация сложных коллекций

Ну я надеюсь что про простую xml-сериализацию вы уже знаете :) Однако постоянно встает вопрос - как сериализовать классы, содержащие коллекции типа Hastable, Dictionary или Hashset (новый тип, доступный в 3-ей версии .Net Framework). Итак. Первое что нам понадобится:
using System.Runtime.Serialization; 
Второе. Пометить сериализуемые классы (все! включая вложенные!) атрибутом [DataContract] и все члены класса, данные которых надо сериализовать артибутом [DataMember]:
[DataContract]
public class MySerializableClass
{
   [DataMember]
   public Dictionary MyCollection = new Dictionary();
   ...
}
Сериализация производится следующим образом:

public void SaveData(string path, MySerializableClass msc)
{
   XmlTextWriter xw = new XmlTextWriter(path, Encoding.UTF8);
   //а это чтобы красиво было :)
   xw.Formatting = Formatting.Indented;
   XmlDictionaryWriter writer = XmlDictionaryWriter.CreateDictionaryWriter(xw);
   DataContractSerializer ser = new DataContractSerializer(typeof(MySerializableClass));
   ser.WriteObject(writer, ds);
   writer.Close();
   xw.Close();
}
Ну и, соответственно, десериализация:

public MySerializableClass LoadData(string path)
{
   MySerializableClass msc = null;   using (FileStream fs = new FileStream(path, FileMode.Open))
   {
      XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, Encoding.UTF8, new XmlDictionaryReaderQuotas(), null);
      DataContractSerializer ser = new DataContractSerializer(typeof(MySerializableClass));
      msc = (MySerializableClass)ser.ReadObject(reader);
   }

   return msc;
}
P.S.: ну естественно, что все красоты с использованием отступов и кодировок можно опустить - но наша же цель состоит именно в том, чтобы получить более-менее читаемый файл...

4 комментария:

  1. Используя такую сериализацию по сути можно получить XElement из произвольного объекта (путём сериализации и разбора при помощи XElement.Parse).

    Есть ли более изящные, быстрые способы преобразования объекта к XElement?

    ОтветитьУдалить
  2. Честно говоря - не знаю, как-то не было необходимости. Можно попробовать поискать готовые фреймворки-сериализаторы - для .net мне попадалось несколько...

    ОтветитьУдалить
  3. Коротко и ясно!
    Пасиба!

    ОтветитьУдалить
  4. Авторам MSDN не мешало бы взять у вас несколько уроков на тему описания справочной информации.

    ОтветитьУдалить