Поделиться через


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

Происходит при завершении сеанса.

Явные реализации интерфейса

IDesignerSerializationManager.AddSerializationProvider(IDesignerSerializationProvider)

Добавляет диспетчеру сериализации пользовательский поставщик сериализации.

IDesignerSerializationManager.Context

Задает стек контекста для этого сеанса сериализации.

IDesignerSerializationManager.CreateInstance(Type, ICollection, String, Boolean)

Реализует метод CreateInstance(Type, ICollection, String, Boolean).

IDesignerSerializationManager.GetInstance(String)

Извлекает экземпляр созданного объекта с указанным именем.

IDesignerSerializationManager.GetName(Object)

Загружает имя для указанного объекта.

IDesignerSerializationManager.GetSerializer(Type, Type)

Получает сериализатор запрошенного типа для указанного типа объекта.

IDesignerSerializationManager.GetType(String)

Возвращает тип указанного имени.

IDesignerSerializationManager.Properties

Реализует свойство Properties.

IDesignerSerializationManager.RemoveSerializationProvider(IDesignerSerializationProvider)

Удаляет поставщика сериализации, который был добавлен ранее.

IDesignerSerializationManager.ReportError(Object)

Используется для создания сообщений об обратимых ошибках в процессе сериализации.

IDesignerSerializationManager.ResolveName

Возникает, если не удается найти заданное имя в таблице имен диспетчера сериализации с помощью метода IDesignerSerializationManager.GetName(Object).

IDesignerSerializationManager.SerializationComplete

Возникает при завершении сериализации.

IDesignerSerializationManager.SetName(Object, String)

Задает имя для указанного объекта.

IServiceProvider.GetService(Type)

Описание этого элемента содержится в методе GetService(Type).

Применяется к

См. также раздел