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 |
發生於處置工作階段時。 |