方法 : ワークフローをシリアル化する
Windows Workflow Foundation フレームワークは、ワークフローのシリアル化と逆シリアル化を行うために使用するシリアル化インフラストラクチャを提供します。既定では、ワークフローは特定の書式規則に従って、ワークフロー マークアップにシリアル化されます。
既定のシリアル化
新規開発するアクティビティには、ワークフロー マークアップへの既定のシリアル化の方法が用意されています。既定のシリアル化は、多くのアクティビティに十分に対応できますが、カスタムなシリアライザが必要な場合もあります。
WorkflowMarkupSerializer クラスを使用して、ワークフローをシリアル化する方法の例を次に示します。
using System.Xml;
using System.IO;
using System.Workflow.ComponentModel.Serialization;
using System.Globalization;
...
// In the implementation of your host application, create a sequential
// workflow.
SequentialWorkflowActivity workflow1 = new SequentialWorkflowActivity();
// Construct workflow.
...
// Serialize workflow.
WorkflowMarkupSerializer serializer = new WorkflowMarkupSerializer();
StringWriter strWriter = new StringWriter(CultureInfo.InvariantCulture);
XmlWriter xmlWriter = XmlWriter.Create(strWriter);
serializer.Serialize(xmlWriter, workflow1);
// Create a log file, open it, and write the serialized workflow to it.
File.WriteAllText(@"C:\logfile.txt", strWriter.ToString());
Imports System.Xml
Imports System.IO
Imports System.Workflow.ComponentModel.Serialization
Imports System.Globalization
...
' In the implementation of your host application, create a sequential
' workflow.
Dim workflow1 as New SequentialWorkflowActivity()
' Construct workflow.
...
' Serialize workflow.
Dim serializer as new WorkflowMarkupSerializer()
Dim strWriter as new StringWriter(CultureInfo.InvariantCulture)
Dim xmlWriter as XmlWriter = XmlWriter.Create(strWriter)
serializer.Serialize(xmlWriter, workflow1)
' Create a log file, open it, and write the serialized workflow to it.
File.WriteAllText("C:\logfile.txt", strWriter.ToString())
シリアル化インフラストラクチャ
Windows Workflow Foundation の既定のシリアル化インフラストラクチャは、既定のアクティビティをシリアル化するために必要な型をすべて提供します。Windows Workflow Foundation フレームワークの既定のアクティビティ セットの詳細については、「Windows Workflow Foundation アクティビティ」を参照してください。
シリアル化インフラストラクチャにおける重要なクラスを次に示します。
WorkflowMarkupSerializer クラスは、シリアル化インフラストラクチャで使用される基本シリアル化型です。この型は、シリアル化のルールを実装する、シリアル化のためのいくつかの基本サービスを提供します。アクティビティのためのシリアライザ、またはカスタム アクティビティのためのカスタム シリアライザは、このクラスを継承する必要があります。
ActivityMarkupSerializer クラスは、WorkflowMarkupSerializer クラスを継承します。この型は、すべての基本的なアクティビティをシリアル化するために使用されます。基本的なアクティビティとは、複合アクティビティでないアクティビティです。
CompositeActivityMarkupSerializer クラスは、ActivityMarkupSerializer クラスを継承し、複合アクティビティのシリアル化を提供します。CompositeActivityMarkupSerializer には、子アクティビティを処理するメソッドが追加されており、自身のシリアル化プロバイダを使用してシリアル化できます。
シリアル化の書式規則
ワークフロー マークアップは、オブジェクト階層をシリアル化した形式です。オブジェクトがどのようにシリアル化されるのかは、オブジェクトのプロパティによって異なります。型インスタンスのシリアル化では、次の 2 つのルールが主に利用されます。
オブジェクトの型定義は、XAML での要素名です。
オブジェクトのプロパティは、XAML での要素定義において属性に対応します。
オブジェクトのシリアル化について、次のコード例に示します。
public Class ExampleActivity : Activity
private string property1 = "SomeValue";
private string property2 = "SomeOtherValue";
public string ExampleProperty
{
get
{
return property1;
}
set
{
property1 = value;
}
}
public string ExampleOtherProperty
{
get
{
return property2;
}
set
{
property2 = value;
}
}
// Activity.Execute and other overridden methods not included for clarity.
}
public class ExampleActivity
Inherits Activity
Private property1 As String = "SomeValue"
Private property2 As String = "SomeOtherValue"
Public Property ExampleProperty As String
Get
return property1
End Get
Set (ByVal value As String)
property1 = value
End Set
End Property
Public Property ExampleOtherProperty As String
Get
return property2
End Get
Set (ByVal value As String)
property2 = value
End Set
End Property
' Activity.Execute and other overridden methods not included for
' clarity.
End Class
このクラスのインスタンスは、次の XAML コード例に示すようにシリアル化されます。
<ns0:ExampleActivity ExampleOtherProperty="SomeOtherValue" x:Name="ExampleActivity" ExampleProperty="SomeValue" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:ns0="clr-namespace:CustomWFActivities;Assembly=CustomWFActivities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
このコード例は、2 つの文字列プロパティ ExampleProperty と ExampleOtherProperty が、ExampleActivity 要素の属性になることを示します。"SomeValue" と "SomeOtherValue" は、この 2 つのフィールドの実際の値です。
もちろん、クラス定義はコード例の ExampleActivity クラスよりずっと複雑になることがあります。より複雑なオブジェクトのシリアル化には、他の規則が適用されます。
メモ : |
---|
WorkflowMarkupSerializer は、入れ子にされた型のシリアル化をサポートしていません。たとえば、カスタム アクティビティを作成し、このアクティビティの中で入れ子型を定義した場合、コンパイル時にエラーが発生します。 |
シリアル化のカスタマイズ
シリアル化の形式は、カスタマイズできます。カスタマイズは、 2 つのレベルで行うことができます。カスタム シリアル化書式と各型のシリアル化を含む、まったく新しいシリアル化インフラストラクチャを提供できます。他のシリアル化は、アクティビティのレベルで行うことができます。シリアル化インフラストラクチャが Windows Workflow Foundation の作成フレームワークによって提供されるワークフロー マークアップであることに変わりはありませんが、個々のアクティビティのレイアウトは変更できます。
アクティビティのカスタマイズ
カスタム シリアライザを作成する場合は、次のコード例に示すように、カスタム シリアライザへの参照を、アクティビティ作成者が指定しなければなりません。
[DesignerSerializer(typeof(ExampleActivityMarkupSerializer), typeof(WorkflowMarkupSerializer))]
public class ExampleActivity : Activity
{
}
<DesignerSerializer(GetType(ExampleActivityMarkupSerializer), GetType(WorkflowMarkupSerializer))> _
Public Class ExampleActivity
Inherits Activity
End Class
2 つのパラメータを持つ DesignerSerializer 属性を使用して、シリアライザを指定します。
最初のパラメータは、属性が定義されているクラスのインスタンスをシリアル化するために使用するシリアライザを指定します。
2 番目のパラメータは、シリアライザの基本型を指定します。シリアライザの基本型は、使用するシリアル化スキームを指定します。
DesignerSerializer のコード例では、2 番目の属性が WorkflowMarkupSerializer を指定しています。これは、使用する基本シリアル化インフラストラクチャが WorkflowMarkupSerializer に基づいていることを意味します。
カスタム シリアライザの定義
カスタム シリアライザは、基本シリアル化型を継承するクラスであることが必要です。DesignerSerializer のコード例では、ExampleActivityMarkupSerializer が ExampleActivity クラスのカスタム シリアライザです。ExampleActivityMarkupSerializer は、属性の 2 番目のパラメータ WorkflowMarkupSerializer を継承します。
シリアル化マネージャはアクティビティのシリアル化を開始すると、クラス定義を使用して DesignerSerializer 属性の 2 番目のパラメータにある WorkflowMarkupSerializer の型を調べ、カスタム シリアライザの型を判別します。次に、シリアライザのインスタンスを取得し、使用します。
ワークフロー マークアップ
ワークフロー マークアップは、Windows Workflow Foundation ランタイム エンジンが実行できるワークフローを記述します。ワークフロー マークアップは、コンポーネント シリアル化スキームとして、ワークフローを形成するアクティビティ階層、およびアクティビティがイベントを発生させたときに起動される関連ロジックを記述するために使用されます。
ワークフロー マークアップには、記述についての定まった構文がありません。ワークフロー マークアップは、オブジェクト階層をプロパティおよびメソッドと共に表現するために使用できる汎用スキーマを定義します。各アクティビティには、アクティビティ メタデータをオブジェクトに定義されているマークアップで表現できるようにするシリアル化ロジックがあります。
詳細については、「ワークフロー マークアップの使用」を参照してください。
関連項目
参照
System.Workflow.ComponentModel.Serialization
概念
カスタム アクティビティのシリアル化
方法 : ワークフローをコンパイルする
ワークフロー マークアップの使用
その他の技術情報
Copyright © 2007 by Microsoft Corporation.All rights reserved.