Сериализация и десериализация объектов в C#
Сериализация - это процесс преобразования объекта в последовательный поток-подобный формат. Часто это означает преобразование его в XML-данные для хранения или передачи по сети.
Deserialization - это процесс использования сериализации для восстановления исходного объекта.
Базовая сериализация в C# относительно проста. Сначала создайте класс, который вы хотите сериализовать и украсить его с помощью атрибута Serializable. Определите свойства класса, как обычно. Обратите внимание, что класс должен быть public и должен иметь пустой конструктор по умолчанию, который не принимает никаких параметров. Без этих двух функций сериализатор не может создавать объекты.
В следующем коде показан класс Person этого примера.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// Создайте 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.
1 2 3 4 5 6 7 8 9 10 |
<?xml version="1.0" encoding="utf-16"?> <Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" & GT; <FirstName>Mickey</FirstName> <LastName>Moose</LastName> <Street>1337 Leet St</Street> <City>Bugsville</City> <State>CA</State> <Zip>12345</Zip> </Person> |
Следующий код показывает, как программа десериализует сериализацию для воссоздания объекта Person.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// 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 для хранения ранее созданной сериализации.