Введение в сериализацию

Сериализация – это способ сохранения состояния класса в потоке (stream). Обратный процесс – восстановление состояния класса – называется десериализацией.

Сериализация и десериализация объектов
Сериализация и десериализация объектов

Простой пример сериализации и десериализации объекта

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

[Serializable]
public class ProgramSettings {
    /// <summary>
    /// Дата последнего запуска программы
    /// </summary>
    public DateTime LastLaunchDate { get; set; }
}

class Program {
    static void Main(string[] args) {
        ProgramSettings settings = new ProgramSettings {
            LastLaunchDate = DateTime.Now
        };

        XmlSerializer serializer = new XmlSerializer( typeof(ProgramSettings) );

        using (FileStream stream = File.OpenWrite("settings.xml")) {
            serializer.Serialize(stream, settings);
        }
    }
}

Эта программа после запуска создаст файл “settings.xml” в папке, откуда была запущена программа. Содержимое файла будет следующим:

<?xml version="1.0"?>
<ProgramSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <LastLaunchDate>2020-03-02T16:24:20.1600727+03:00</LastLaunchDate>
</ProgramSettings>

Обратное преобразование (десериализация) будет выглядеть следующим образом:

class Program {
    static void Main(string[] args) {
        ProgramSettings settings;

        XmlSerializer serializer = new XmlSerializer( typeof(ProgramSettings) );            

        using (FileStream stream = File.OpenRead("settings.xml")) {
            settings = (ProgramSettings)serializer.Deserialize(stream);
        }

        Console.WriteLine(settings.LastLaunchDate);
    }
}

Вывод программы:

Вывод программы десериализации объекта
Вывод программы десериализации объекта

В .net Framework присутствуют также классы для сериализации объектов в другие форматы, например, в двоичный формат, или SOAP. Также обратите внимание, что в тестовой программе мы использовали файловый поток, однако сериализовать объект можно в любой объект, имеющий в иерархии наследования класс Stream.


Бинарная сериализация и SOAP сериализация

Бинарная и SOAP сериализация аналогична XML-сериализации. Для того, чтобы сериализовать объект в один из этих форматов, в предыдущем примере достаточно заменить XmlSerializer на BinaryFormatter или SoapFormatter соответственно:

class Program {
    static void Main(string[] args) {
        ProgramSettings settings = new ProgramSettings {
            LastLaunchDate = DateTime.Now
        };

        // изменяем XmlSerializer на BinaryFormatter или SoapFormatter
        BinaryFormatter formatter = new BinaryFormatter();            

        using (FileStream stream = File.OpenWrite("settings.bin")) {
            formatter.Serialize(stream, settings);
        }
    }
}

Для того, чтобы класс SoapFormatter стал доступен для использования, нужно дополнительно импортировать библиотеку System.Runtime.Serialization.Formatters.Soap.

Аналогичным образом происходит десериализация объектов из бинарного или SOAP формата:

class Program {
    static void Main(string[] args) {
        ProgramSettings settings;

        // изменяем XmlSerializer на BinaryFormatter или SoapFormatter
        BinaryFormatter formatter = new BinaryFormatter( typeof(ProgramSettings) );            

        using (FileStream stream = File.OpenRead("settings.xml")) {
            settings = (ProgramSettings)formatter.Deserialize(stream);
        }

        Console.WriteLine(settings.LastLaunchDate);
    }
}

Обратите внимание, что для того чтобы сериализовать класс при помощи бинарного или SOAP формата, необходимо пометить этот класс атрибутом [Serializable].


Различия между XML, SOAP и бинарной сериализацией.

Не смотря на сходство в способах сериализации объектов, между XML, SOAP и бинарной сериализацией существуют различия. Например, XML, SOAP сериализует только открытые поля класса, а бинарная сериализация сохраняет значения также и закрытых полей.

avatar
5000
  Подписаться  
Уведомление о