BinaryFormatter C#
Всем доброго времени суток. На связи Алексей Гулынин. В прошлых двух статьях мы узнали, что такое сериализация, и как подготовить класс для этой процедуры. За превращение объекта в поток байтов отвечает объект класса, реализующего интерфейс "IFormatter". Класс BinaryFormatter в C# как раз и реализует бинарную сериализацию.
Класс "BinaryFormatter" располагается в пространстве имён "System.Runtime.Serizalization.Formatters.Binary".
Для того, чтобы выполнить данную сериализацию необходимо создать объект класса "BinaryFormatter". Также нужен объект, который будем сериализовывать + нам нужен поток ("Stream"). О потоках поговорим в одной из следующих статей.
Давай на примере нашей комнаты разберем, как выполнить сериализацию объекта:
using System; using System.Text; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; namespace TestApplicationForStudy { class Program { static void Main(string[] args) { // Создаём объект класса Room room1 = new Room(); room1.Length = 5; room1.Width = 4; room1.HasFurniture = true; // Сериализуем его IFormatter formatter = new BinaryFormatter(); FileStream buffer = File.Create("C:\\room.txt"); formatter.Serialize(buffer, room1); buffer.Close(); Console.ReadLine(); } } [Serializable] public class Room : ISerializable { public double Width { get; set; } public double Length { get; set; } [NonSerialized] public int numberOfWindows; public bool HasFurniture { get; set; } public Room() { } public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("Width", this.Width); info.AddValue("Length", this.Length); info.AddValue("hasFurniture", this.HasFurniture); } public Room(SerializationInfo info, StreamingContext context) { this.Width = (double)info.GetValue("Width", typeof(double)); this.Length = (double)info.GetValue("Length", typeof(double)); this.HasFurniture = (bool)info.GetValue("hasFurniture", typeof(bool)); } } }
Немного разберем данный код:
"File.Create()" создаёт файл, открывает его и возвращает поток.
"formatter.Serialize()" отвечает за сериализацию. "buffer" — это поток, в который будут записываться данные. "room1" — это объект, который нужно сериализовать.
То, как объект будет сериализоваться зависит от того, какой "Formatter" используется и от того, как реализован сам класс (какие атрибуты висят на полях, реализован ли интерфейс "ISerializable").
Десериализация выполняется следующим образом:
IFormatter formatter = new BinaryFormatter(); // Открываем файл, который нужно прочитать FileStream buffer = File.OpenRead("C:\\room.txt"); // Либо можно так // FileStream buffer = new FileStream(C:\\room.txt", Read); Room room1 = formatter.Deserialize(buffer) as Room; Console.WriteLine("Длина = {0}, Ширина = {1}", room1.Length, room1.Width); if (room1.HasFurniture) Console.WriteLine("Мебель есть"); else Console.WriteLine("Мебели нет!"); buffer.Close();
Каждый раз, после окончания работы с потоком, его необходимо закрывать (метод "Close()").
В данной статье вы узнали, как реализовать бинарную сериализацию в C#.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.