Похожие презентации:
Промышленное программирование. Лекция 17
1.
Faculty of Mathematics & InformaticsDepartment of Advanced
Programming Technologies
Промышленное
программирование
Лекция 17
Сериализация.
XML, JSON, Binary сериализация.
Yanka Kupala State University of Grodno
Grodno, 2022
2.
Сериализация (Serialization)Serialization — это процесс преобразования одного или нескольких
объектов в последовательный поток данных, часто в текстовом формате.
Deserialization – это обратный процесс восстановления данных объекта
после сериализации.
Сериализация - это один из способов портируемого хранения данных.
Можно сериализовать объект и передать его на вход другой
программе. Эта программа десериализует объект.
Сериализуемые объекты могут быть простыми (Customer или Person)
или могут представлять собой сложные структуры данных, включая
объекты, имеющие ссылки на другие объекты. Например, можно
сериализовать объект CustomerOrder, который включает в себя
массив объектов Order, каждый из которых содержит список
объектов OrderItem.
3.
Способы сериализацииВ .NET есть три способа хранения данных в результате сериализации:
XML data,
JSON data,
or binary data.
System.Xml.Serialization namespace
System.Runtime.Serialization.Json namespace
4.
XML - сериализация• Для сериализации и десериализации объектов в формате XML
используются методы Serialize и Deserialize класса XmlSerializer.
• Методы работают только для классов, у которых есть конструктор
без параметров, либо конструктор по умолчанию.
• Методы работают только для public свойств и полей. Все остальные
свойства и поля игнорируются.
• Методу Serialize требуется параметр типа поток, XmlWriter или
TextWriter, StreamWriter, куда будут записываться сериализованные
объекты.
5.
Пример сериализации объекта Customer6.
Результат XML-сериализации.7.
Управление сериализациейМожно изменить формат сериализации, используя атрибуты
<OrderItem>
<Description>Tape</Description>
<Quantity>12</Quantity>
<UnitPrice>0.75</UnitPrice>
</OrderItem
<OrderItem Description="Tape" Quantity="12" UnitPrice="0.75" />
Пространство имен System.Xml.Serialization определяет атрибуты, которые
можно использовать для управления сериализацией. Атрибуты
добавляются к классам или свойствам и полям классов.
8.
XMLAttribute, XmlArray, XmlIgnoreАтрибут XMLAttribute, что значение поля (свойства) должно храниться в
результате сериализации не как XML-элемент, а как XML-атрибут. Можно
изменить имя поля в результирующем XML-документе, или же указать,
что значение поля не сериализуется (игнорируется)
public class Customer
{
[XmlAttribute]
public string FirstName, LastName;
public class Order
[XmlArray("CustomerOrders")]
public List<Order> Orders {
= new
[XmlIgnore]
List<Order>();
public DateTime OrderDate;
}
[XmlArray("Items")]
public OrderItem[] OrderItems;
}
Demo
9.
Часто используемые атрибуты сериализации10.
JSON СериализацияJSON ( JavaScript Object Notation ) - формат представления текстовых
данных, который используется для обмена данными между приложениями.
JSON данные представляют собой пары name : value , где name – это
текст, а value может быть одного из следующих типов:
• Число (Number)
• Строка (String)
• Логическое значение (Boolean)
• Массив (Array). Последовательность значений, разделенных запятой
и включенных в квадратные скобки.
• Объект (Object) . Коллекция пар key : value. Пары разделены запятой,
вся коллекция заключена в фигурные скобки.
• null
11.
Результат JSON-сериализация{
"FirstName“ : "Rod",
"LastName“ : "Stephens",
"Orders":
[
{
"OrderDate":"\/Date(1396591200000-0600)\/",
"OrderItems":
[
{"Description":"Pencil","Quantity":12,"UnitPrice":0.25},
{"Description":"Notepad","Quantity":6,"UnitPrice":1.00}
]
},
{
"OrderDate":"\/Date(1397714400000-0600)\/",
"OrderItems":
[
{"Description":"Binder","Quantity":1,"UnitPrice":3.50},
{"Description":"Tape","Quantity":12,"UnitPrice":0.75}
]
}
]
}
12.
Выполнение JSON-сериализации//Объект
Создаем класса
сериализатор
для объектов класса Customer.
DataContractJsonSerializer
сериализует и десериализует
DataContractJsonSerializer serializer =
объекты, используя JSON-формат. Метод WriteObject сериализует объект,
new DataContractJsonSerializer(typeof(Customer));
метод ReadObject десериализует его.
// Создает поток для хранения данных объекта Customer
using (MemoryStream stream = new MemoryStream())
{
// Сериализуем объект класса Customer
serializer.WriteObject(stream, customer);
// Конвертируем поток в строку
stream.Seek(0, SeekOrigin.Begin);
string serialization;
using (StreamReader reader = new StreamReader(stream))
{
serialization = reader.ReadToEnd();
// Выводим результат сериализации (в данном случае в текстовое поле win-прилож.)
serializationTextBox.Text = serialization;
// Десериализуем объект из потока
stream.Position = 0;
Customer newCustomer = (Customer)serializer.ReadObject(stream);
// Выводим результат десериализации (в данном случае методом, смотрите Demo)
DisplayCustomer(deserializedTextBox, newCustomer);
}
}
13.
Управление JSON-сериализацией• JSON не позволяет хранить значения полей, как атрибуты
• Если класс не содержит атрибутов сериализации, то сериализатор
пытается сериализовать все public поля и свойства
[DataContract(Name = "Item")]
Если поле
класса
снабдить
атрибутом IgnoreDataMember, то оно не
public
class
OrderItem
сериализуется
{
[DataMember]
public
string DataContract,
Description;то сериализатор
Если класс снабжен
атрибутом
сериализует только public поля и свойства, помеченные атрибутом
DataMember. [DataMember]
public int Quantity;
[DataMember(Name = "PriceEach")]
public decimal UnitPrice;
}
14.
Binary-сериализацияНекоторые данные, такие как изображения, например, не сериализуются в
формат XML или JSON. Это невозможно.
Также невозможно применить XML или JSON сериализацию к структуром
данных, которые содержат циклические ссылки.
public class Department
{
public Image Logo;
public string Name;
public List<Employee> Employees = new
List<Employee>();
}
public class Employee
{
public string Name;
public Department Department;
}
XML и JSON сериализатор не работают для такой структуры, так как объект
Department содержит ссылку на объект Employee, а объект Employee
ссылается на объект Department.
15.
Бинарная сериализация. BinaryFormatter.Класс BinaryFormatter сериализует данные и справляется с циклическими
структурами и двоичными данными (изображения, например).
[Serializable]
public class Department
{
public Image Logo;
public string Name;
public List<Employee> Employees = new List<Employee>();
}
[Serializable]
public class Employee
{
public string Name;
public Department Department;
}
BinaryFormatter работает только с классами, помеченными атрибутом
Serializable.
16.
BinaryFormatter// Создаем бинарный сериализатор
IFormatter
formatter игнорирует
= new BinaryFormatter();
• BinaryFormatter
все атрибуты
членов класса, кроме
Serializable.
// Создаем поток для сериализации
using (MemoryStream stream = new MemoryStream())
{• Нельзя изменить имя поля или свойства в процессе сериализации
// Сериализуем объек класса Department
formatter.Serialize(stream,
department);
• BinaryFormatter игнорирует
атрибут XmlIgnore, поэтому все поля
и
свойства сериализуются.
// Отобразим результат сериализации в виде строки
byte[] bytes = stream.ToArray();
string
serialization =игнорирует
BitConverter.ToString(bytes).Replace("-",
" ");
• BinaryFormatter
модификаторы доступа (privacy)
и
сериализует все поля и свойства, даже если они private.
// Вывод результата в текстовое поле (смотрите Demo)
serializationTextBox.Text = serialization;
// Десериализуем объект Department
stream.Seek(0, SeekOrigin.Begin);
Department newDepartment = (Department)formatter.Deserialize(stream);
// Отображаем результат десериализации (данные и логотип, смотрите Demo)
deserializedPictureBox.Image = newDepartment.Logo;
deserializedTextBox.Text = DisplayDepartment(newDepartment);}
Demo