入れ子のシリアライザで情報を使用できるように、シリアライザによって使用するスタック オブジェクトを提供します。
この型のすべてのメンバの一覧については、ContextStack メンバ を参照してください。
System.Object
System.ComponentModel.Design.Serialization.ContextStack
NotInheritable Public Class ContextStack
[C#]
public sealed class ContextStack
[C++]
public __gc __sealed class ContextStack
[JScript]
public class ContextStack
スレッドセーフ
この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。
解説
シリアライザの種類によっては、シリアライザの状態を正しく永続化するために、オブジェクトのコンテキストについての情報が必要になることがあります。 ContextStack を使用すると、シリアライザは、シリアル化されているオブジェクトのコンテキストについてのデータを、別のシリアライザからアクセスできるスタックに設定できます。 Context オブジェクトはシリアライザの使用について情報を共有するために IDesignerSerializationManager によって提供されます。
デザイン ドキュメントをシリアル化するプロセスは、多階層の入れ子で構成される場合があります。オブジェクトの状態を正しく永続化するには、各入れ子レベルのオブジェクトでコンテキスト情報が必要です。このような状況では、コンテキスト スタックを使用すると便利です。シリアライザは、入れ子のシリアライザを呼び出す前にコンテキスト オブジェクトをスタックに設定できます。オブジェクトを設定したシリアライザは、入れ子のシリアライザへの呼び出しに対する戻り値が返された後で、スタックに設定された各オブジェクトを削除する必要があります。
通常、スタック上のオブジェクトには、シリアル化されている現在のオブジェクトのコンテキストについての情報が格納されます。親シリアライザは、次にシリアル化されるオブジェクトについてのコンテキスト情報をスタックに追加し、適切なシリアライザを呼び出し、そのシリアライザがオブジェクトへの実行を完了した時点でスタックからコンテキスト情報を削除します。このスタックでどのオブジェクトがプッシュされるかは、各シリアライザの実装によって異なります。
たとえば、Enabled というプロパティを持つオブジェクトに Boolean のデータ型があるとします。シリアライザがこの値をデータ ストリームに書き込む場合、コンテキストまたはプロパティの型も含める必要が生じる場合もあります。しかし、シリアライザに対しては Boolean 値の書き込みだけが命令されているため、シリアライザは必要な情報を取得できません。シリアライザにこの情報を提供するために、親シリアライザは、コンテキスト スタック上で Enabled プロパティを指す PropertyDescriptor をプッシュできます。
使用例
[Visual Basic, C#, C++] ContextStack を使用して 10 個の値をプッシュし、その後ポップするコード例を次に示します。
Imports System
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.ComponentModel.Design.Serialization
Module ContextStackExample
Sub Main()
' Create a ContextStack.
Dim stack As New ContextStack
' Push ten items on to the stack and output the value of each.
Dim number As Integer
For number = 0 To 9
Console.WriteLine(("Value pushed to stack: " + number.ToString()))
stack.Push(number)
Next number
' Pop each item off the stack.
Dim item As Object = stack.Pop()
While Not item Is Nothing
Console.WriteLine(("Value popped from stack: " + item.ToString()))
item = stack.Pop()
End While
End Sub
End Module
[C#]
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Windows.Forms;
namespace ContextStackExample
{
class ContextStackExample
{
[STAThread]
static void Main(string[] args)
{
// Create a ContextStack.
ContextStack stack = new ContextStack();
// Push ten items on to the stack and output the value of each.
for( int number = 0; number < 10; number ++ )
{
Console.WriteLine( "Value pushed to stack: "+number.ToString() );
stack.Push( number );
}
// Pop each item off the stack.
object item = null;
while( (item = stack.Pop()) != null )
Console.WriteLine( "Value popped from stack: "+item.ToString() );
}
}
}
[C++]
#using <mscorlib.dll>
#using <System.Windows.Forms.dll>
#using <System.dll>
using namespace System;
using namespace System::ComponentModel;
using namespace System::ComponentModel::Design;
using namespace System::ComponentModel::Design::Serialization;
using namespace System::Windows::Forms;
int main()
{
// Create a ContextStack.
ContextStack* stack = new ContextStack();
// Push ten items on to the stack and output the value of each.
for( int number = 0; number < 10; number ++ )
{
Console::WriteLine( S"Value pushed to stack: {0}", __box(number));
stack->Push(__box(number));
}
// Pop each item off the stack.
Object* item = 0;
while( (item = stack->Pop()) != 0 )
Console::WriteLine( S"Value popped from stack: {0}", item );
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
名前空間: System.ComponentModel.Design.Serialization
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
アセンブリ: System (System.dll 内)
参照
ContextStack メンバ | System.ComponentModel.Design.Serialization 名前空間 | IDesignerSerializationManager