При работе программ довольно часто возникает необходимость сохранения тех или иных данных. Один из возможных вариантов сохранения – запись информации в двоичный файл.
Данный вариант интересен уже, как минимум тем, что позволяет сохранять данные практически любого формата и впоследствии восстанавливать их, не прибегая при этом к сложным манипуляциям.
Это становится возможным благодаря сериализации. Процессу, который описывает преобразование объекта в поток байт для его дальнейшей передачи в память или базу данных либо для сохранения в файл.
Чтобы объект можно было сериализовать его класс должен быть обязательно отмечен атрибутом [Serializable].
В качестве примера рассмотрим простой класс, который описывает автомобиль. В классе имеются только два свойства, которые инициализируются в конструкторе при создании объекта: марка автомобиля (CarBrand) и его максимальная скорость (MaxSpeed). Исходный код класса приведён ниже.
[Serializable] class Car { public string CarBrand { get ;set;} public int MaxSpeed { get; set; } public Car(string brand,int maxspeed) { CarBrand = brand; MaxSpeed = maxspeed; } }
Создадим объект класса Car, который хранит сведения о некотором автомобиле.
Car c = new Car("Ferrari", 200);
Сериализация в поток байт производится с помощью класса BinaryFormatter.
Чтобы сохранить созданный объект файл необходимо создать файловый поток с помощью класса FileStream для записи файла и выполнить сериализацию объекта в этот поток с помощью метода Serialize класса BinaryFormatter.
BinaryFormatter binFormat = new BinaryFormatter(); using (Stream fStream = new FileStream("Car.dat", FileMode.Create, FileAccess.Write, FileShare.None)) { binFormat.Serialize(fStream, c); }
В результате в папке с исполняемым файлом программы будет создан файл Car.dat, который содержит в себе созданный ранее объект класса Car.
При необходимости этот объект также может быть легко восстановлен.
Уже упомянутый класс BinaryFormatter позволяет не только сериализовать но и десериализовать объекты. То есть выполнять обратное преобразование из массива двоичных данных в объект.
Для этого нужно создать поток для чтения файла и воспользоваться методом Deserialize. Так как данный метод возвращает Object необходимо приведение типов.
BinaryFormatter binFormat = new BinaryFormatter(); using (Stream fStream = new FileStream("Car.dat", FileMode.Open, FileAccess.Read, FileShare.None)) { c=(Car)binFormat.Deserialize(fStream); }
Таким образом, исходный объект класса Car, который был сохранён в двоичном файле, полностью восстановлен.
Стоит отметить, что как сериализация так и десериализация сами по себе достаточно сложные и трудоёмкие процессы. Но, благодаря наличию в .NET Framework уже готовых инструментов, которые их реализуют, выполнение этих процессов при разработке .NET приложений не составляет особого труда.