Сериализация и десериализация объектов в 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 для хранения ранее созданной сериализации.
