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 上与接口类似:设计器实际上提供用户界面 (UI) ,并提供 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) 方法。

适用于

另请参阅