Сериализация

Все, что вы хотели знать о программизме, но боялись спросить.
Аватара пользователя
Leo Gan
Маньяк
Сообщения: 1764
Зарегистрирован: 29 апр 2005, 16:55
Откуда: где-то рядом с жёлтым карликом
Контактная информация:

Re: Сериализация

Сообщение Leo Gan »

В .NET есть DataContractSerializer и XmlSerializer.
Я бы посоветовал посмотреть в сторону WCF, где сериализация - часть архитектуры. Кстати, в JSON формат WCF тоже сериализует, не только в XML.
Если основательно этим заниматься то есть Software Factory. Ресуешь или экспортируешь типы в картинку, типа UML, а дальше генерируется код, two-way процесс, между прочим. Это бесплатная добавка к VS2008.
Из SQL сериализовывать в XML - есть for XML добавка в Select, которая задействует OPENXML, а тот уже рекордсеты в XML выводит.
varennik
Частый Гость
Сообщения: 20
Зарегистрирован: 09 авг 2006, 21:51
Откуда: Москва - Ванкувер
Контактная информация:

Re: Сериализация

Сообщение varennik »

Если все узлы в дереве одного типа, то самый простой вариант:

Код: Выделить всё

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml.Serialization;

namespace ConsoleApplication9
{
    [XmlRoot("entity")]
    public class Entity
    {
        public Entity()
        {
        }

        public Entity(int id, string name, params Entity[] childs)
        {
            this.Name = name;
            this.Id = id;
            this.Childs.AddRange(childs);
        }

        private string _name;
        [XmlAttribute("name")]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private int _id;
        [XmlAttribute("id")]
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        private List<Entity> _childs = new List<Entity>();
        [XmlArray("childEntities")]
        public List<Entity> Childs
        {
            get { return _childs; }
            set { _childs = value; }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Serialization
            Entity obj = 
                new Entity(0, "Root", new Entity[] { 
                    new Entity(1, "Child 1",    
                        new Entity(11, "Child 11")), 
                    new Entity(2, "Child 2") }); 

            using (StreamWriter w = new StreamWriter(@"C:\Temp\test.xml"))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Entity));
                serializer.Serialize(w, obj);
            }

            //Deserialization
            Entity obj2 = null;
            using (StreamReader r = new StreamReader(@"C:\Temp\test.xml"))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Entity));
                obj2 = (Entity)serializer.Deserialize(r);
            }
        }
    }
}
Eсли, нужен полиморфизм, тогда придется использовать атрибут XmlInclude, т.к. по умолчанию инфа о типе не сохраняется
(Alex)
Маньяк
Сообщения: 4203
Зарегистрирован: 08 мар 2006, 15:45
Откуда: Ричмонд

Re: Сериализация

Сообщение (Alex) »

лучше чилдрэн :mrgreen2:
Ответить