DesignerSerializationManager Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет реализацию IDesignerSerializationManager интерфейса.
public ref class DesignerSerializationManager : IServiceProvider, System::ComponentModel::Design::Serialization::IDesignerSerializationManager
public class DesignerSerializationManager : IServiceProvider, System.ComponentModel.Design.Serialization.IDesignerSerializationManager
type DesignerSerializationManager = class
interface IDesignerSerializationManager
interface IServiceProvider
Public Class DesignerSerializationManager
Implements IDesignerSerializationManager, IServiceProvider
- Наследование
-
DesignerSerializationManager
- Реализации
Комментарии
Интерфейс IDesignerSerializationManager предназначен для интерфейса, независимого от формата, для объекта, который управляет сериализацией. По сути, он предоставляет контекст и службы сериализаторам, которые фактически выполняют десериализацию. IDesignerSerializationManager помогает в десериализации, отслеживая объекты. Это похоже на метод IDesignerHost интерфейса: конструкторы фактически предоставляют пользовательский интерфейс (пользовательский интерфейс) и IDesignerHost предоставляют клей, позволяющий различным конструкторам работать вместе.
Класс DesignerSerializationManager реализует IDesignerSerializationManager. Она предназначена для предоставления универсальной формы десериализации, аналогичной сериализаторам во время выполнения, например BinaryFormatter.
Класс DesignerSerializationManager достигает трех целей:
Это простой, готовый объект, который можно использовать для десериализации различных форматов.
Он является универсальным и не привязан к определенному формату. Его можно использовать одинаково для десериализации CodeDOM, а также десериализации разметки.
Он расширяем и поддерживает различные методы сериализации, используемые в сценариях копирования и вставки и отмены.
Сериализация во время разработки имеет следующие отличия от сериализации объектов во время выполнения:
Объект, выполняющий сериализацию, обычно отделен от объекта времени выполнения, поэтому логика времени разработки может быть удалена из компонента.
Схема сериализации предполагает, что объект будет создан полностью инициализирован, а затем изменен с помощью вызовов свойств и методов во время десериализации.
Свойства объекта с значениями, которые никогда не были заданы в объекте (свойства содержат значения по умолчанию) не сериализуются. И наоборот, поток десериализации может иметь отверстия.
Акцент ставится на качество содержимого в потоке сериализации, а не на полную сериализацию объекта. Это означает, что если нет определенного способа сериализации объекта, этот объект может быть пропущен, а не вызывать исключение. Обработчик сериализации может предоставить эвристики здесь, чтобы решить, какие ошибки можно игнорировать и которые не будут возвращены.
Поток сериализации может иметь больше данных, чем требуется для десериализации. Сериализация исходного кода, например, содержит пользовательский код, смешанный с кодом, необходимым для десериализации графа объектов. Этот пользовательский код должен игнорироваться при десериализации и сохранении при сериализации.
Из-за этих различий другая модель сериализации применяется к сериализации во время разработки. Эта модель использует отдельный объект сериализатора для каждого типа данных, сериализуемого. Каждый сериализатор предоставляет свой небольшой вклад в проблему в целом. Эти сериализаторы координируются с помощью общего диспетчера сериализации. Диспетчер сериализации отвечает за поддержание состояния между этими разными сериализаторами. В качестве примера рассмотрим следующий класс:
public class SampleObject
{
private string stringValue = null;
private int intValue = int.MinValue;
public string StringProperty
{
get { return this.stringValue; }
set { this.stringValue = value; }
}
public int IntProperty
{
get { return this.intValue; }
set{ this.intValue = value; }
}
}
Public Class SampleObject
Private stringValue As String = Nothing
Private intValue As Integer = Integer.MinValue
Public Property StringProperty() As String
Get
Return Me.stringValue
End Get
Set
Me.stringValue = value
End Set
End Property
Public Property IntProperty() As Integer
Get
Return Me.intValue
End Get
Set
Me.intValue = value
End Set
End Property
End Class
Экземпляр этого класса будет использовать три разных сериализатора: один для SampleObjectстрок, а другой — для целых чисел. Сериализатор для называется корневым сериализатором SampleObject , так как SampleObject является корнем графа сериализации. Кроме того, можно создать более сложные графы объектов. Например, рассмотрим, что произойдет, если SampleObject были изменены следующим образом:
public class SampleObject
{
private string stringValue = null;
private int intValue = int.MinValue;
private SampleObject childValue = null;
public string StringProperty
{
get { return this.stringValue; }
set { this.stringValue = value; }
}
public int IntProperty
{
get { return this.intValue; }
set { this.intValue = value; }
}
public SampleObject Child
{
get { return this.childValue; }
set { this.childValue = value; }
}
}
Public Class SampleObject
Private stringValue As String = Nothing
Private intValue As Integer = Integer.MinValue
Private childValue As SampleObject = Nothing
Public Property StringProperty() As String
Get
Return Me.stringValue
End Get
Set
Me.stringValue = value
End Set
End Property
Public Property IntProperty() As Integer
Get
Return Me.intValue
End Get
Set
Me.intValue = value
End Set
End Property
Public Property Child() As SampleObject
Get
Return Me.childValue
End Get
Set
Me.childValue = value
End Set
End Property
End Class
Это позволяет SampleObject иметь дочерний объект, который является другим экземпляром самого себя. Следующий код заполняется графом объектов:
class Program
{
static void Main(string[] args)
{
SampleObject root = new SampleObject();
SampleObject currentObject = root;
for (int i = 0; i < 10; i++)
{
SampleObject o = new SampleObject();
currentObject.Child = o;
currentObject = o;
}
}
}
Class Program
Public Overloads Shared Sub Main()
Main(System.Environment.GetCommandLineArgs())
End Sub
Overloads Shared Sub Main(args() As String)
Dim root As New SampleObject()
Dim currentObject As SampleObject = root
Dim i As Integer
For i = 0 To 9
Dim o As New SampleObject()
currentObject.Child = o
currentObject = o
Next i
End Sub
End Class
При root сериализации будет использоваться четыре сериализатора: один корневой сериализатор, один сериализатор для дочернего SampleObject, один сериализатор для intи один сериализатор для string. Сериализаторы кэшируются на основе типа, поэтому не требуется создавать сериализатор для каждого экземпляра SampleObject.
Класс DesignerSerializationManager основан на идее сеанса сериализации. Сеанс сохраняет состояние, к которому можно получить доступ различным сериализаторам. При удалении сеанса это состояние уничтожается. Это помогает гарантировать, что сериализаторы остаются в значительной степени без отслеживания состояния и помогают очистить сериализаторы, которые были повреждены. В следующих таблицах описывается управление состоянием в сеансах и между ними.
Глобальное состояние
Это состояние принадлежит объекту диспетчера сериализации, но не зависит от текущего сеанса сериализации.
| Объект | Использование |
|---|---|
| Поставщики сериализации | Объекты могут добавлять себя в качестве пользовательских поставщиков сериализации. Так как эти поставщики используются для поиска сериализаторов, они выходят за сеанс сериализации. |
Состояние Session-Owned
Это состояние принадлежит сеансу и уничтожается при уничтожении сеанса. Следовательно, доступ к любым свойствам или методам, которые будут управлять этим состоянием, вызовет исключение, если диспетчер сериализации не находится в активном сеансе.
| Объект | Использование |
|---|---|
| событие ResolveName | Событие ResolveName присоединено сериализатором для предоставления дополнительного разрешения имен. Все обработчики отсоединяются от этого события при завершении сеанса. |
| событие SerializationComplete | Событие SerializationComplete возникает непосредственно перед удалением сеанса. Затем все обработчики отсоединяются от этого события. |
| Таблица имен | Диспетчер сериализации поддерживает таблицу, которая сопоставляется между объектами и их именами. Сериализаторы могут предоставлять имена объектов для простой идентификации. Эта таблица имен очищается при завершении сеанса. |
| Кэш сериализатора | Диспетчер сериализации поддерживает кэш сериализаторов, которые было предложено предоставить. Этот кэш очищается при завершении сеанса. Общедоступный GetSerializer метод можно безопасно вызывать в любое время, но его значение кэшируется только в том случае, если он вызывается из сеанса. |
| Стек контекста | Диспетчер сериализации поддерживает объект, называемый стеком контекста, к которому можно получить доступ с Context помощью свойства. Сериализаторы могут использовать этот стек для хранения дополнительных сведений, доступных другим сериализаторам. Например, сериализатор, сериализирующий значение свойства, может отправить имя свойства в стек сериализации, прежде чем запрашивать значение для сериализации. Этот стек очищается при завершении сеанса. |
| Список ошибок | Диспетчер сериализации поддерживает список ошибок, возникших во время сериализации. Этот список, к которому осуществляется доступ через Errors свойство, очищается при завершении сеанса. Доступ к свойству Errors между сеансами приведет к исключению. |
Конструкторы
| Имя | Описание |
|---|---|
| DesignerSerializationManager() |
Инициализирует новый экземпляр класса DesignerSerializationManager. |
| DesignerSerializationManager(IServiceProvider) |
Инициализирует новый экземпляр DesignerSerializationManager класса с указанным поставщиком услуг. |
Свойства
| Имя | Описание |
|---|---|
| Container |
Возвращает или задает контейнер для этого диспетчера сериализации. |
| Errors |
Возвращает список ошибок, возникших во время сериализации или десериализации. |
| PreserveNames |
Возвращает или задает значение, указывающее, должен ли CreateInstance(Type, ICollection, String, Boolean) метод проверять наличие заданного имени в контейнере. |
| PropertyProvider |
Возвращает объект, который должен использоваться для предоставления свойств свойств свойству диспетчера Properties сериализации. |
| RecycleInstances |
Возвращает или задает значение, указывающее, будет ли CreateInstance(Type, ICollection, String, Boolean) всегда создавать новый экземпляр типа. |
| ValidateRecycledTypes |
Возвращает или задает значение, указывающее, будет ли метод проверять, будут ли CreateInstance(Type, ICollection, String, Boolean) совпадающие имена ссылаться на тот же тип. |
Методы
| Имя | Описание |
|---|---|
| CreateInstance(Type, ICollection, String, Boolean) |
Создает экземпляр типа. |
| CreateSession() |
Создает новый сеанс сериализации. |
| Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
| GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
| GetRuntimeType(String) |
Возвращает тип, соответствующий указанному имени типа. |
| GetSerializer(Type, Type) |
Возвращает сериализатор для заданного типа объекта. |
| GetService(Type) |
Возвращает запрошенную службу. |
| GetType() |
Возвращает Type текущего экземпляра. (Унаследовано от Object) |
| GetType(String) |
Возвращает запрошенный тип. |
| MemberwiseClone() |
Создает неглубокую копию текущей Object. (Унаследовано от Object) |
| OnResolveName(ResolveNameEventArgs) |
Вызывает событие ResolveName. |
| OnSessionCreated(EventArgs) |
Вызывает событие SessionCreated. |
| OnSessionDisposed(EventArgs) |
Вызывает событие SessionDisposed. |
| ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
События
| Имя | Описание |
|---|---|
| SessionCreated |
Происходит при создании сеанса. |
| SessionDisposed |
Происходит при удалении сеанса. |