Сначала рассмотрим более удобный способ. С помощью него объект можно сериализовать только в XML.
Первое что нужно для этого сделать -- добавить в References ссылки на System.Xml.dll и (только в Silverlight приложениях) System.Xml.Serialization.dll. В первой, в неймспейсе System.Xml.Serialization содержатся атрибуты, необходимые для указания какому элементу XML соответствует какой-либо класс или свойство:
- XmlRootAttribute -- указывает на то, что класс к которому он (атрибут) применен, является корнем XML-файла. Он может принимать аргумент ElementName, который задает как будет называться соответствующий тег в XML'е. Если ElementName не задан, то за название тега принимается имя класса, к которому был применен атрибут.
- XmlAttributeAttribute -- указывает сериализатору на то, что свойство к которому применен атрибут, является атрибутом XML. В качестве аргумента может принимать название атрибута в XML.
- XmlElementAttribute -- указывает сериализатору на то, что свойство к которому применен атрибут, является элементом XML. Также как и предыдущий может принимать имя в XML в качестве аргумента.
- XmlArrayAttribute -- применяется к свойству, имеющему перечислимый тип (массив), в случае если необходимо чтобы входящие в соответствующий ему элементы XML дочерние элементы, были представлены как элементы массива этого свойства.
- XmlArrayItemAttribute -- также применяется к свойству, имеющему перечислимый тип, вместе с атрибутом XmlArrayAttribute, чтобы указать параметры соответствующего элементу массива, элемента XML (например тип или имя).
Пример разметки классов для сериализации приведен в листинге:
using System; using System.Xml.Serialization; using System.IO; namespace SerializationTest1 { public class Product { private string name; private int price; [XmlElement("price")] public int Price { get { return price; } set { price = value; } } [XmlAttribute("name")] public string Name { get { return name; } set { name = value; } } } [XmlRoot("shop")] public class Shop { private string owner; private string name; private Product[] products; [XmlAttribute("name")] public string Name { get { return name; } set { name = value; } } [XmlAttribute("owner")] public string Owner { get { return owner; } set { owner = value; } } [XmlArray("products"), XmlArrayItem("product")] public Product[] Products { get { return products; } set { products = value; } } } }После разметки сериализуемых классов атрибутами (чтобы сериализатор знал что во что сериализировать), переходим непосредственно к самой сериализации.
Для этого в неймспейсе System.Xml.Serialization существует класс XmlSerializer. Его конструктор принимает в качестве параметра тип класса, который соответствует корневому элементу XML.
Класс содержит 3 нужные нам метода:
CanDeserialize(XmlReader xmlReader) -- проверяет, получится ли получить из переданного в параметре XML, указанный при инстанцировании тип.
Deserialize(XmlReader xmlReader) -- возвращает объект, полученный в результате десериализачии XML считанного из xmlReader.
Serialize(XmlWriter xmlWriter, object o) -- сериализует объект o и записывает полученный XML в xmlWriter.
Пример получения из XML объекта описанного выше класса, приведен в листинге ниже:
using System; using System.Xml.Serialization; using System.IO; namespace SerializationTest1 { class Program { static void Main(string[] args) { string xml = @"<shop name=""Supershop"" owner=""Fedya Pupkin""> <products> <product name=""phone""> <price>10000</price> </product> <product name=""book""> <price>500</price> </product> </products> </shop>"; XmlSerializer serializer = new XmlSerializer(typeof(Shop)); object obj = serializer.Deserialize( new StringReader(xml)); Shop shop = (Shop)obj; } } }
Комментариев нет:
Отправить комментарий