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) 方法。

適用於

另請參閱