Xml-сериализация в C#

Захотелось написать немного про Xml-сериализацию в C#. Для начала сам пример. В примере не весь код, а только касающийся сериализации.

    public class Account
    {
        // здесь вместо XmlElement можно XmlAttribute. Формат сохранения будет другой. Проверьте.
        [XmlElement("id")] public int ID;
        [XmlElement("owner")] public string Owner;
        [XmlElement("saldo")] public decimal Saldo;
        [XmlElement("cdate")] public DateTime CDate;
    }

    [XmlRoot("bank")]
    public class Bank
    {
        // чтобы поля accounts и id_counter сохранялись при использовании xml-сериализации
        // нужно чтобы они были публичными. Такое использование нарушает инкапсуляцию.
        // Чтобы обойти такое нужно создать свойства класса (property), дублирующее содержимое
        // этих полей, но при загрузке опять же через эти свойства будут устанавливаться сохраненные
        // значения, то есть в любом случае нарушение скрытности полей.
        [XmlArray("accounts")]
        public List<Account> accounts;
        [XmlElement("id-counter")]
        public int id_counter = 1;
        
        public Bank()
        {
            accounts = new List<Account>();
        }

        public void Save()
        {
            XmlSerializer s = new XmlSerializer( typeof( Bank ) );
            TextWriter w = new StreamWriter("bank.xml");
            s.Serialize( w, this );
            w.Flush();
            w.Close();
        }

        public static Bank Load()
        {
            Bank bank;
            XmlSerializer s = new XmlSerializer( typeof( Bank ) );
            TextReader r = new StreamReader("bank.xml");
            bank = (Bank)s.Deserialize( r );
            r.Close();
            return bank;
        }
    }
 

Вот что получается при сохранении:

<?xml version="1.0" encoding="utf-8"?>
<bank xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <account>
    <Account>
      <id>1</id>
      <owner>naugrim</owner>
      <saldo>10</saldo>
      <cdate>2009-12-03T00:38:54.07108+03:00</cdate>
    </Account>
    <Account>
      <id>2</id>
      <owner>test</owner>
      <saldo>20</saldo>
      <cdate>2009-12-03T00:38:57.541126+03:00</cdate>
    </Account>
    <Account>
      <id>3</id>
      <owner>ilnur</owner>
      <saldo>30</saldo>
      <cdate>2009-12-03T00:39:00.082628+03:00</cdate>
    </Account>
  </account>
  <id-counter>4</id-counter>
</bank>

Вообще существует большое количество атрибутов, но я могу только догадываться зачем они нужны.

Пояснения:

  • атрибут [XmlElement("id")] указывает что поле/свойство будет выводится как элемент (примеры выше)
  • атрибут [XmlAttribute("id")] указывает что поле/свойство будет выводится как атбирут (попробуйте), т.е. получилось бы:
        <Account id="2">
        </Account>

Пояснения по сохранению:

            XmlSerializer s = new XmlSerializer( typeof( Bank ) );

Создаем XmlSerializer, указывая тип данных (класс), экземпляр которого будем записывать в файл. В данном случае это класс Bank.

            TextWriter w = new StreamWriter("bank.xml");

Открываем поток для записи.

            s.Serialize( w, this );
            w.Flush();
            w.Close();

Выполняем сериализацию в файл, "смываем буфер" и закрываем файл.

Загрузка происходит аналогично. Отличие лишь в методе Deserialize, который возвращает экземляр класса.

вернуться назад

Комментарии

мне кажется, можно сделать

мне кажется, можно сделать проект закинуть туда этот класс.
классы сериализации находятся в пространстве имен System.Xml.Serialization

Вопрос

А где полный код программы?