DesignerSerializationManager Класс

Определение

Предоставляет реализацию интерфейса IDesignerSerializationManager.Provides an implementation of the IDesignerSerializationManager interface.

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Интерфейс разработан как независимый от формата интерфейс к объекту, который управляет сериализацией.The IDesignerSerializationManager interface is designed to be a format-independent interface to an object that controls serialization. Он по сути предоставляет контекст и службы для сериализаторов, которые фактически выполняют десериализацию.It essentially provides context and services to serializers, which actually perform the deserialization. IDesignerSerializationManager помогает в процессе десериализации, отслеживая объекты.IDesignerSerializationManager assists in the deserialization process by keeping track of objects. Это аналогично приему IDesignerHost интерфейса: конструкторы фактически предоставляют пользовательский интерфейс и IDesignerHost предоставляют связующий объект, позволяющий различным дизайнерам работать вместе.This is similar in technique to the IDesignerHost interface: designers actually provide the user interface (UI), and IDesignerHost provides the glue that allows different designers to work together.

DesignerSerializationManagerКласс реализует IDesignerSerializationManager .The DesignerSerializationManager class implements IDesignerSerializationManager. Он предназначен для предоставления универсальной формы десериализации, похожей на сериализаторы времени выполнения, такие как BinaryFormatter .It is designed to provide a generic form of deserialization that is similar to run-time serializers like the BinaryFormatter.

DesignerSerializationManagerКласс достигает трех целей:The DesignerSerializationManager class achieves three goals:

  • Это простой, готовый объект, который можно использовать для десериализации различных форматов.It is a simple, turnkey object that can be used to deserialize a variety of formats.

  • Он является универсальным и не привязан к какому-либо конкретному формату.It is generic and not tied to any particular format. Его можно использовать как для десериализации CodeDOM, так и для десериализации разметки.It can be used equally for CodeDOM deserialization as well as markup deserialization.

  • Он является расширяемым и поддерживает различные методы сериализации, используемые в сценариях копирования и вставки, а также для операций отмены и повтора.It is extensible and supports different serialization methods that are used in copy/paste and undo/redo scenarios.

Сериализация во время разработки имеет следующие отличия от сериализации объектов во время выполнения:Design-time serialization has the following differences from run-time object serialization:

  • Объект, выполняющий сериализацию, обычно отделен от объекта времени выполнения, поэтому логика времени разработки может быть удалена из компонента.The object performing the serialization is generally separate from the run-time object, so that design-time logic can be removed from a component.

  • Схема сериализации предполагает, что объект будет полностью инициализирован, а затем изменен с помощью вызовов свойств и методов во время десериализации.The serialization scheme assumes the object will be created fully initialized, and then modified through property and method invocations during deserialization.

  • Свойства объекта, имеющие значения, которые никогда не были заданы для объекта (свойства содержат значения по умолчанию), не сериализуются.Properties of an object that have values that were never set on the object (the properties contain the default values) are not serialized. И наоборот, поток десериализации может содержать отверстия.Conversely, the deserialization stream may have holes.

  • Основное внимание уделяется качеству содержимого в потоке сериализации, а не полной сериализации объекта.Emphasis is placed on the quality of the content within the serialization stream, rather than the full serialization of an object. Это означает, что если нет определенного способа сериализации объекта, этот объект можно пропустить, а не создавать исключение.This means that if there is no defined way to serialize an object, that object may be skipped rather than throwing an exception. Механизм сериализации может предоставить эвристику, чтобы решить, какие сбои можно игнорировать, а какие — невосстанавливаемыми.The serialization engine may provide heuristics here to decide which failures can be ignored and which are unrecoverable.

  • Поток сериализации может содержать больше данных, чем требуется для десериализации.The serialization stream may have more data than is needed for deserialization. Сериализация исходного кода, например, содержит пользовательский код в сочетании с кодом, необходимым для десериализации графа объектов.Source code serialization, for example, has user code mixed in with the code needed to deserialize an object graph. Этот пользовательский код необходимо игнорировать при десериализации и сохранить в сериализации.This user code must be ignored on deserialization and preserved on serialization.

Из-за этих различий для сериализации во время разработки применяется другая модель сериализации.Because of these differences, a different serialization model applies to design-time serialization. В этой модели используется отдельный объект сериализатора для каждого сериализуемого типа данных.This model utilizes a separate serializer object for each data type being serialized. Каждый сериализатор предоставляет небольшой вклад в общую проблему.Each serializer provides its small contribution to the problem as a whole. Все эти сериализаторы согласовываются с помощью общего диспетчера сериализации.These serializers are all coordinated through a common serialization manager. Диспетчер сериализации отвечает за поддержание состояния между этими разными сериализаторами.The serialization manager is responsible for maintaining state between these different serializers. В качестве примера рассмотрим следующий класс:As an example, consider the following class:

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 , один для строк, а другой для целых чисел.An instance of this class would utilize three different serializers: one for SampleObject, one for strings, and another for integers. Сериализатор для называется SampleObject корневым сериализатором, так как SampleObject является корнем графа сериализации.The serializer for SampleObject is called the root serializer because SampleObject is the root of the serialization graph. Также можно создать более сложные графы объектов.More complex object graphs can be created as well. Например, рассмотрим, что произойдет, если SampleObject были изменены следующим образом:For example, consider what would happen if SampleObject were changed as follows:

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 иметь дочерний элемент, который является другим экземпляром.This allows SampleObject to have a child that is another instance of itself. Следующий код заполняет граф объектов:The following code fills in the object graph:

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 .When root is serialized, there will be four serializers used: one root serializer, one serializer for the child SampleObject, one serializer for int, and one serializer for string. Сериализаторы кэшируются на основе типа, поэтому нет необходимости создавать сериализаторы для каждого экземпляра SampleObject .Serializers are cached based on type, so there is no need to create a serializer for each instance of SampleObject.

DesignerSerializationManagerКласс основан на идее сеанса сериализации.The DesignerSerializationManager class is based on the idea of a serialization session. Сеанс сохраняет состояние, к которому могут обращаться различные сериализаторы.A session maintains state that can be accessed by the various serializers. При удалении сеанса это состояние уничтожается.When a session is disposed, this state is destroyed. Это позволяет гарантировать, что сериализаторы остаются в основном без отслеживания состояния, и помогает очищать сериализаторы, которые были повреждены.This helps to ensure that serializers remain largely stateless, and helps to clean up serializers that are have been corrupted. В следующих таблицах описывается управление состоянием в и между сеансами.The following tables describe how state is managed in and among sessions.

Глобальное состояниеGlobal State

Это состояние принадлежит объекту диспетчера сериализации, но не зависит от текущего сеанса сериализации.This state is owned by the serialization manager object, but is independent of the current serialization session.

ОбъектObject ИспользованиеUsage
Поставщики сериализацииSerialization providers Объекты могут добавлять себя в качестве пользовательских поставщиков сериализации.Objects can add themselves as custom serialization providers. Поскольку эти поставщики используются для нахождение сериализаторов, они разрабатывают сеанс сериализации.Because these providers are used to locate serializers, they outlive a serialization session.

Состояние Session-OwnedSession-Owned State

Это состояние принадлежит сеансу и уничтожается при уничтожении сеанса.This state is owned by a session and is destroyed when a session is destroyed. Следовательно, если диспетчер сериализации не находится в активном сеансе, то при доступе к любым свойствам или методам, которые работали с этим состоянием, возникает исключение.Consequently, accessing any properties or methods that would manipulate this state will throw an exception if the serialization manager is not in an active session.

ОбъектObject ИспользованиеUsage
СобытиеResolveNameResolveName event ResolveNameСобытие присоединяется сериализатором для предоставления дополнительного разрешения имен.The ResolveName event is attached by a serializer to provide additional resolution of names. После завершения сеанса все обработчики отсоединяются от этого события.All handlers are detached from this event when a session terminates.
СобытиеSerializationCompleteSerializationComplete event SerializationCompleteСобытие возникает непосредственно перед ликвидацией сеанса.The SerializationComplete event is raised just before a session is disposed. Затем все обработчики отсоединяются от этого события.Then, all handlers are detached from this event.
Таблица именName table Диспетчер сериализации поддерживает таблицу, сопоставленную между объектами и их именами.The serialization manager maintains a table that maps between objects and their names. Сериализаторы могут предоставлять имена объектов для простоты идентификации.Serializers may give objects names for easy identification. Эта таблица имен удаляется после завершения сеанса.This name table is cleared when the session terminates.
Кэш сериализатораSerializer cache Диспетчер сериализации поддерживает кэш сериализаторов, которые он запросил.The serialization manager maintains a cache of serializers it has been asked to supply. Этот кэш удаляется после завершения сеанса.This cache is cleared when the session terminates. Открытый GetSerializer метод можно безопасно вызывать в любое время, но его значение кэшируется только в том случае, если оно вызывается из сеанса.The public GetSerializer method can safely be called at any time, but its value is cached only if it is called from within a session.
Стек контекстаContext stack Диспетчер сериализации поддерживает объект, называемый стеком контекста, к которому можно получить доступ со Context свойством.The serialization manager maintains an object called the context stack, which you can access with the Context property. Сериализаторы могут использовать этот стек для хранения дополнительных сведений, доступных другим сериализаторам.Serializers can use this stack to store additional information that is available to other serializers. Например, сериализатор, который сериализует значение свойства, может отправить имя свойства в стеке сериализации, прежде чем запрашивать значение для сериализации.For example, a serializer that is serializing a property value can push the property name on the serialization stack before asking the value to serialize. Этот стек удаляется после завершения сеанса.This stack is cleared when the session is terminated.
Список ошибокError list Диспетчер сериализации поддерживает список ошибок, произошедших во время сериализации.The serialization manager maintains a list of errors that occurred during serialization. Этот список, доступ к которому осуществляется через Errors свойство, удаляется после завершения сеанса.This list, which is accessed through the Errors property, is cleared when the session is terminated. Обращение к Errors свойству между сеансами приведет к исключению.Accessing the Errors property between sessions will result in an exception.

Конструкторы

DesignerSerializationManager()

Инициализирует новый экземпляр класса DesignerSerializationManager.Initializes a new instance of the DesignerSerializationManager class.

DesignerSerializationManager(IServiceProvider)

Инициализирует новый экземпляр класса DesignerSerializationManager с заданным поставщиком служб.Initializes a new instance of the DesignerSerializationManager class with the given service provider.

Свойства

Container

Возвращает или задает контейнер для данного диспетчера сериализации.Gets or sets to the container for this serialization manager.

Errors

Возвращает список ошибок, которые возникли в процессе сериализации или десериализации.Gets the list of errors that occurred during serialization or deserialization.

PreserveNames

Возвращает или задает значение, указывающее на то, выполнять ли методу CreateInstance(Type, ICollection, String, Boolean) проверку на наличие заданных имен в контейнере.Gets or sets a value indicating whether the CreateInstance(Type, ICollection, String, Boolean) method should check for the presence of the given name in the container.

PropertyProvider

Возвращает объект, используемый для предоставления свойств для свойства диспетчера сериализации Properties.Gets the object that should be used to provide properties to the serialization manager's Properties property.

RecycleInstances

Получает или задает значение для обозначения, будет ли метод CreateInstance(Type, ICollection, String, Boolean) всегда создавать новый экземпляр типа.Gets or sets a value that indicates whether CreateInstance(Type, ICollection, String, Boolean) will always create a new instance of a type.

ValidateRecycledTypes

Получает или задает значение, указывающее, будет ли метод CreateInstance(Type, ICollection, String, Boolean) проверять то, что соответствующие имена относятся к одному и тому же типу.Gets or sets a value that indicates whether the CreateInstance(Type, ICollection, String, Boolean) method will verify that matching names refer to the same type.

Методы

CreateInstance(Type, ICollection, String, Boolean)

Создает экземпляр типа.Creates an instance of a type.

CreateSession()

Создает новый сеанс сериализации.Creates a new serialization session.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.Determines whether the specified object is equal to the current object.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.Serves as the default hash function.

(Унаследовано от Object)
GetRuntimeType(String)

Получает тип, соответствующий указанному имени типа.Gets the type corresponding to the specified type name.

GetSerializer(Type, Type)

Задает сериализатор для указанного типа объекта.Gets the serializer for the given object type.

GetService(Type)

Возвращает запрашиваемую службу.Gets the requested service.

GetType()

Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance.

(Унаследовано от Object)
GetType(String)

Возвращает требуемый тип.Gets the requested type.

MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Унаследовано от Object)
OnResolveName(ResolveNameEventArgs)

Вызывает событие ResolveName.Raises the ResolveName event.

OnSessionCreated(EventArgs)

Вызывает событие SessionCreated.Raises the SessionCreated event.

OnSessionDisposed(EventArgs)

Вызывает событие SessionDisposed.Raises the SessionDisposed event.

ToString()

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

(Унаследовано от Object)

События

SessionCreated

Происходит при создании сеанса.Occurs when a session is created.

SessionDisposed

Происходит при завершении сеанса.Occurs when a session is disposed.

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

IDesignerSerializationManager.AddSerializationProvider(IDesignerSerializationProvider)

Добавляет диспетчеру сериализации пользовательский поставщик сериализации.Adds a custom serialization provider to the serialization manager.

IDesignerSerializationManager.Context

Задает стек контекста для этого сеанса сериализации.Gets the context stack for this serialization session.

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

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

IDesignerSerializationManager.GetInstance(String)

Извлекает экземпляр созданного объекта с указанным именем.Retrieves an instance of a created object of the specified name.

IDesignerSerializationManager.GetName(Object)

Загружает имя для указанного объекта.Retrieves a name for the specified object.

IDesignerSerializationManager.GetSerializer(Type, Type)

Получает сериализатор запрошенного типа для указанного типа объекта.Gets a serializer of the requested type for the specified object type.

IDesignerSerializationManager.GetType(String)

Возвращает тип указанного имени.Gets a type of the specified name.

IDesignerSerializationManager.Properties

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

IDesignerSerializationManager.RemoveSerializationProvider(IDesignerSerializationProvider)

Удаляет поставщика сериализации, который был добавлен ранее.Removes a previously added serialization provider.

IDesignerSerializationManager.ReportError(Object)

Используется для создания сообщений об обратимых ошибках в процессе сериализации.Used to report a recoverable error in serialization.

IDesignerSerializationManager.ResolveName

Возникает, если не удается найти заданное имя в таблице имен диспетчера сериализации с помощью метода IDesignerSerializationManager.GetName(Object).Occurs when IDesignerSerializationManager.GetName(Object) cannot locate the specified name in the serialization manager's name table.

IDesignerSerializationManager.SerializationComplete

Возникает при завершении сериализации.Occurs when serialization is complete.

IDesignerSerializationManager.SetName(Object, String)

Задает имя для указанного объекта.Sets the name for the specified object.

IServiceProvider.GetService(Type)

Описание этого элемента содержится в методе GetService(Type).For a description of this member, see the GetService(Type) method.

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

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