Сериализация и десериализация объектов в C#
Сериализация - это процесс преобразования объекта в последовательный поток-подобный формат. Часто это означает преобразование его в XML-данные для хранения или передачи по сети.
Deserialization - это процесс использования сериализации для восстановления исходного объекта.
Базовая сериализация в C# относительно проста. Сначала создайте класс, который вы хотите сериализовать и украсить его с помощью атрибута Serializable. Определите свойства класса, как обычно. Обратите внимание, что класс должен быть public и должен иметь пустой конструктор по умолчанию, который не принимает никаких параметров. Без этих двух функций сериализатор не может создавать объекты.
В следующем коде показан класс Person этого примера.
using System.Xml.Serialization; ... // Класс должен быть Сериализуемым и общедоступным. [Serializable()] public class Person { public string FirstName; public string LastName; public string Street; public string City; public string State; public string Zip; // Пусто конструктор, необходимый для сериализации. public Person() { } // Инициализация конструктора. public Person(string first_name, string last_name, string street, string city, string state, string zip) { FirstName = first_name; LastName = last_name; Street = street; City = city; State = state; Zip = zip; } }
Следующий код показывает, как программа сериализует объект Person.
// Создайте Person, сериализуйте его и покажите сериализацию. private void btnSerialize_Click(object sender, EventArgs e) { // Создаем нового человека. Person per = new Person( txtFirstName.Text, txtLastName.Text, txtStreet.Text, txtCity.Text, txtState.Text, txtZip.Text); // Создаем XmlSerializer и StringWriter. XmlSerializer xml_serializer = new XmlSerializer(typeof(Person)); using (StringWriter string_writer = new StringWriter()) { // Сериализация. xml_serializer.Serialize(string_writer, per); // Отображение сериализации. txtSerialization.Text = string_writer.ToString(); } // Сброс текстовых полей. txtFirstName.Clear(); txtLastName.Clear(); txtStreet.Clear(); txtCity.Clear(); txtState.Clear(); txtZip.Clear(); }
Сначала код создает новый объект Person, передавая его конструктору значения, введенные в текстовые поля программы. Затем он создает объект XmlSerializer, передавая его конструктору тип объекта, который он будет сериализовать: Person.
Далее код создает объект StringWriter, чтобы он мог сериализоваться в строку. Если вы хотите, вы можете сериализовать другие объекты потока, такие как потоки файлов.
Код вызывает метод Serialize сериализатора, передавая ему поток для сериализации (StringWriter) и объект Person для сериализации , Программа отображает сериализацию в текстовом поле txtSerialization.
В следующем тексте показана результирующая сериализация. Обратите внимание, что сериализатор автоматически использует имена открытых переменных объекта Person как теги в полученном XML.
Mickey Moose 1337 Leet St Bugsville CA 12345
Следующий код показывает, как программа десериализует сериализацию для воссоздания объекта Person.
// Deserialize Person. private void btnDeserialize_Click(object sender, EventArgs e) { // Уничтожьте сериализацию. XmlSerializer xml_serializer = new XmlSerializer(typeof(Person)); using (StringReader string_reader = new StringReader(txtSerialization.Text)) { Person per = (Person)(xml_serializer.Deserialize(string_reader)); // Отображение свойств Person в TextBoxes. txtFirstName.Text = per.FirstName; txtLastName.Text = per.LastName; txtStreet.Text = per.Street; txtCity.Text = per.City; txtState.Text = per.Street; txtZip.Text = per.Zip; } txtSerialization.Clear(); }
Код создает новый объект XmlSerializer для Person, как и раньше. Он создает инициализацию StringReader для хранения ранее созданной сериализации.