DesignerSerializationManager 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
提供 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 |
在释放会话时发生。 |