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 |
Происходит при завершении сеанса. |