Ну я надеюсь что про простую 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.: ну естественно, что все красоты с использованием отступов и кодировок можно опустить - но наша же цель состоит именно в том, чтобы получить более-менее читаемый файл...
Используя такую сериализацию по сути можно получить XElement из произвольного объекта (путём сериализации и разбора при помощи XElement.Parse).
ОтветитьУдалитьЕсть ли более изящные, быстрые способы преобразования объекта к XElement?
Честно говоря - не знаю, как-то не было необходимости. Можно попробовать поискать готовые фреймворки-сериализаторы - для .net мне попадалось несколько...
ОтветитьУдалитьКоротко и ясно!
ОтветитьУдалитьПасиба!
Авторам MSDN не мешало бы взять у вас несколько уроков на тему описания справочной информации.
ОтветитьУдалить