DesignerSerializationManager クラス
アセンブリ: System.Design (system.design.dll 内)
構文
Public Class DesignerSerializationManager Implements IDesignerSerializationManager, IServiceProvider
IDesignerSerializationManager インターフェイスは、シリアル化を制御するオブジェクトに対する、形式に依存しないインターフェイスとしてデザインされています。このインターフェイスは、基本的に、実際は逆シリアル化を実行するシリアライザにコンテキストとサービスを提供します。IDesignerSerializationManager は、オブジェクトの追跡を続けることによって逆シリアル化プロセスを支援します。これは、IDesignerHost インターフェイスに対する手法においても同様です。デザイナは、実際にはユーザー インターフェイス (UI: User Interface) を提供し、IDesignerHost は、さまざまなデザイナを結びつけて連動できるようにします。
DesignerSerializationManager クラスは、IDesignerSerializationManager を実装しています。このクラスは、BinaryFormatter のような実行時シリアライザと同様の、逆シリアル化の汎用的な形式を提供するようにデザインされています。
DesignerSerializationManager クラスでは、次の 3 つの目標を実現しています。
-
汎用的であり、特定の形式に依存しません。CodeDOM 逆シリアル化、およびマークアップの逆シリアル化の場合と同様に使用できます。
-
拡張性があり、コピー/貼り付けや元に戻す/やり直しの各シナリオで使用する、さまざまなシリアル化メソッドをサポートしています。
デザイン時のシリアル化は、実行時のオブジェクトのシリアル化と次の点で異なります。
-
シリアル化を実行するオブジェクトは、通常、実行時のオブジェクトから分離しているため、デザイン時のロジックをコンポーネントから削除できます。
-
シリアル化方式は、オブジェクトが作成されて完全に初期化され、逆シリアル化の実行時にプロパティやメソッドの呼び出しによって変更されることを前提としています。
-
オブジェクト上で一度も設定されていない値を持つオブジェクト (プロパティに既定値が格納されたオブジェクト) のプロパティはシリアル化されません。逆に言えば、逆シリアル化ストリームには穴がある場合があります。
-
オブジェクトの完全なシリアル化ではなく、シリアル化ストリームの内容の質に重点が置かれます。これは、オブジェクトをシリアル化する方法が定義されていない場合、そのオブジェクトは例外をスローするのではなく、スキップされる可能性があることを意味します。シリアル化エンジンは、どのエラーを無視できるか、また、回復不可能なエラーはどれかを判断するためのヒューリスティックを提供できます。
-
シリアル化ストリームには、逆シリアル化に必要なデータよりも多くのデータが含まれる場合があります。たとえば、ソース コードのシリアル化には、オブジェクト グラフの逆シリアル化に必要なコードと混合されたユーザー コードが含まれます。このユーザー コードは、逆シリアル化では無視され、シリアル化では保持される必要があります。
これらの相違点から、デザイン時のシリアル化には、別のシリアル化モデルが適用されます。このモデルでは、シリアル化の対象となるデータ型ごとに個別のシリアライザ オブジェクトを利用します。各シリアライザは、問題全体に対してはわずかずつ有効です。これらのシリアライザは、すべて共通のシリアル化マネージャを通じて調整されます。シリアル化マネージャは、これら異なるシリアライザ間で状態を維持する必要があります。一例として、次のクラスを考えてみます。
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
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; } } }
このクラスのインスタンスは、SampleObject 用、文字列用、整数用の 3 種類のシリアライザを利用します。SampleObject はシリアル化グラフのルートであるため、SampleObject のシリアライザは、ルート シリアライザと呼ばれます。さらに複雑なオブジェクト グラフも作成できます。たとえば、SampleObject が次のように変更された場合に、何が起こるかを考えてみます。
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
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; } } }
これにより、SampleObject はそれ自体の別のインスタンスである子を持つことができます。オブジェクト グラフに次のコードを記述します。
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
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; } } }
root をシリアル化するときには、ルート シリアライザと、子 SampleObject 用、int 用、string 用の各シリアライザの 4 つのシリアライザが使用されます。シリアライザは型に基づいてキャッシュされるため、SampleObject の各インスタンス用にシリアライザを作成する必要はありません。
DesignerSerializationManager クラスは、シリアル化セッションの概念に基づいています。セッションでは、さまざまなシリアライザがアクセスできる状態を維持します。セッションが破棄されると、この状態も破棄されます。これにより、シリアライザをほとんどの場合状態のないままにしておけます。また、破損した状態にあるシリアライザの削除にも役立ちます。セッション内およびセッション間で、状態がどのように管理されるかを次の表に示します。
グローバル状態セッション保有の状態
この状態はセッションが保有し、セッションが破棄されるとこの状態も破棄されます。したがって、シリアル化マネージャにアクティブなセッションがない場合、この状態を操作するプロパティまたはメソッドにアクセスすると、例外がスローされます。
ResolveName イベント | ResolveName イベントは、名前の解決を提供するためにシリアライザによって接続されます。セッションが終了すると、すべてのハンドラはこのイベントから接続解除されます。 |
SerializationComplete イベント | SerializationComplete イベントは、セッションが破棄される直前に発生します。この後、すべてのハンドラがこのイベントから接続解除されます。 |
名前テーブル | シリアル化マネージャは、オブジェクトとその名前を対応付けるテーブルを保持しています。シリアライザは、識別を容易にするために、オブジェクトに名前を付けることができます。セッションが終了すると、この名前テーブルは消去されます。 |
シリアライザのキャッシュ | シリアル化マネージャは、提供を要求されているシリアライザのキャッシュを保持しています。セッションが終了すると、このキャッシュは消去されます。パブリック メソッド GetSerializer は、いつでも安全に呼び出すことができますが、その値がキャッシュされるのは、セッション内から呼び出した場合だけです。 |
シリアル化マネージャは、コンテキスト スタックと呼ばれるオブジェクトを保持しています。このオブジェクトには、Context プロパティを使用してアクセスできます。シリアライザはこのスタックを使用して、他のシリアライザで使用できる追加情報を格納します。たとえば、プロパティ値をシリアル化するシリアライザは、シリアル化する値を要求する前に、シリアル化スタックでプロパティ名をプッシュできます。セッションが終了すると、このスタックは消去されます。 | |
シリアル化マネージャは、シリアル化の実行時に発生したエラーのリストを保持しています。このリストには、Errors プロパティからアクセスします。セッションが終了すると、エラー リストは消去されます。各セッションの合間に Errors プロパティにアクセスすると、例外が発生します。 |
System.ComponentModel.Design.Serialization.DesignerSerializationManager
プラットフォーム
Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。
参照
Weblioに収録されているすべての辞書からDesignerSerializationManager クラスを検索する場合は、下記のリンクをクリックしてください。
全ての辞書からDesignerSerializationManager クラス を検索
- DesignerSerializationManager クラスのページへのリンク