如何:序列化工作流
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 增加更多方法以处理子活动,子活动可以使用它们自己的序列化提供程序来序列化。
序列化格式规则
工作流标记是对象层次结构的序列化形式。 对象的序列化方式取决于对象的属性。 有两个主要规则来帮助完成类型实例的序列化:
对象的类型定义是 XAML 中的元素名称。
对象的属性 (Property) 映射到 XAML 中的元素定义的属性 (Attribute)。
下面的代码示例举例说明对象序列化。
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" />
该代码示例演示两个字符串属性 (Property) ExampleProperty 和 ExampleOtherProperty 成为了 ExampleActivity 元素的属性 (Attribute)。 值“SomeValue”和“SomeOtherValue”是两个字段的实际值。
当然,类定义可能比代码示例的 ExampleActivity 类要复杂得多。 在更复杂的对象的序列化方面,存在其他规则。
备注
WorkflowMarkupSerializer 不支持对嵌套类型进行序列化。 例如,如果您创建一个自定义活动并在该活动内定义嵌套类型,则您将在编译时收到错误。
自定义序列化
可以自定义序列化格式。 可以在两个级别进行自定义。 可以提供一个全新的序列化基础结构,这包括一个自定义序列化格式以及分别对应于每个类型的序列化。 可在活动级别进行其他序列化。 序列化基础结构仍然是由 Windows Workflow Foundation 创作框架提供的工作流标记,但各个活动布局可以更改。
自定义活动
如果您创建一个自定义序列化程序,则活动作者必须提供对该自定义序列化程序的引用,具体如下面的代码示例所示。
[DesignerSerializer(typeof(ExampleActivityMarkupSerializer), typeof(WorkflowMarkupSerializer))]
public class ExampleActivity : Activity
{
}
<DesignerSerializer(GetType(ExampleActivityMarkupSerializer), GetType(WorkflowMarkupSerializer))> _
Public Class ExampleActivity
Inherits Activity
End Class
序列化程序通过使用 DesignerSerializer 属性来指定,该属性具有两个参数:
第一个参数指定应当用来序列化定义了该属性的类的实例的序列化程序。
第二个参数指定序列化程序的基类型。 序列化程序的基类型指定要使用的序列化方案。
在 DesignerSerializer 代码示例中,第二个属性指定 WorkflowMarkupSerializer。 这意味着要使用的基本序列化基础结构基于 WorkflowMarkupSerializer。
定义自定义序列化程序
自定义序列化程序是必须从序列化基类型继承的类。 在 DesignerSerializer 代码示例中,ExampleActivityMarkupSerializer 是 ExampleActivity 类的自定义序列化程序。 ExampleActivityMarkupSerializer 从 WorkflowMarkupSerializer 继承,后者是该属性的第二个参数。
当序列化管理器开始序列化活动时,它使用类定义来确定自定义序列化程序类型,方法是:在 DesignerSerializer 属性的第二个参数中查找 WorkflowMarkupSerializer 的基类型。 然后获得该序列化程序的一个实例并使用它。
工作流标记
工作流标记描述可以由 Windows Workflow Foundation 运行时引擎执行的工作流。 工作流标记是序列化方案的一部分,用于描述构成工作流的活动层次结构以及在活动引发事件时激活的关联逻辑。
工作流标记没有任何固定的语法来描述它。 它定义可用于表示对象层次结构以及对象的属性和方法的通用方案。 每个活动都有序列化逻辑,这样便可以在为对象定义的标记中表示活动元数据。
有关更多信息,请参见使用工作流标记。
请参见
参考
System.Workflow.ComponentModel.Serialization
概念
其他资源
版权所有 (C) 2007 Microsoft Corporation。保留所有权利。