序列化自定义活动

每个活动的序列化逻辑都能使活动元数据表示为工作流标记。这说明了可以通过 Windows Workflow Foundation 运行时引擎执行的工作流。 工作流标记是序列化方案的一部分,用于描述构成工作流的活动层次结构以及在活动引发事件时激活的关联逻辑。

新活动的开发人员自动拥有序列化为工作流标记的默认功能。 这些默认序列化应该足以用于多数活动,但有时必须创建自定义序列化程序。 有关 Windows Workflow Foundation 使用的默认序列化功能的更多信息,请参见如何:序列化工作流

在设计器中序列化活动属性时,您必须使用 DesignerSerializationVisibilityAttribute 属性以确定是否将序列化属性 (Visible)、不序列化 (Hidden),或者是否将只序列化属性的内容 (Content)。

默认情况下,所有自定义活动属性都设置为 DesignerSerializationVisibility.Visible,因此不用设计器进行序列化。 如果您想序列化集合属性(如 ArrayList),则必须用 DesignerSerializationVisibility.Content 修饰此属性,使 ArrayList 的内容可序列化。 如果您没有用此属性 (attribute) 修饰您的属性 (property),则不会序列化您的集合属性 (property)。 有关设计器序列化的更多信息,请参见Designer Serialization Overview

序列化泛型数据类型

DesignerSerializationVisibilityAttribute 属性 (attribute) 用于序列化自定义活动的属性 (property);但并不是所有数据类型都能序列化。 例如,多数泛型数据类型不能序列化。 只有从 IList 中继承的泛型数据类型或 IDictionary 能够序列化。 如果您想使用这些数据类型,必须遵循以下规则:

  • DesignerSerializationVisibility.Content 值必须修饰此属性。

  • 该属性是只读的。

DesignerSerializationVisibility.Content 与 ContentPropertyAttribute

在自定义活动上序列化属性时,您可以选择使用 DesignerSerializationVisibility.ContentContentPropertyAttribute 二者。 虽然二者听起来相似,但它们是不同的,您序列化自定义活动之前必须理解二者的差异;否则会收到意外结果。

DesignerSerializationVisibility.ContentContentPropertyAttribute 之间的区别是:DesignerSerializationVisibility.Content 序列化集合数据类型的内容,而 ContentPropertyAttribute 省略序列化的属性名称以增加序列化的数据的清晰度。 另外,ContentPropertyAttribute 修饰类,而 DesignerSerializationVisibility.Content 修饰属性。 决不要使用这二者修饰一个属性。 如果您这样做了,将发生编译错误。

下面的示例演示具有字符串数组的自定义活动。 该示例演示如何使用和不使用 ContentPropertyAttribute 序列化数据。

[ContentProperty("Items")]
public class CustomActivity : Activity
{
    private string[] itemsList = {"item1", "item2", "item3"};

    public CustomActivity()
    {
    }

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public IList<string> Items
    {
        get
        {
            return itemsList;
        }
    }

    // Activity.Execute and other overridden methods not included for clarity.
}

这是包含 ContentPropertyAttribute 属性的序列化版本。

<?xml version="1.0" encoding="utf-16"?><ns0:CustomActivity x:Name="CustomActivity" 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">
    <x:Array Type="{x:Type p3:String}" xmlns:p3="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <ns1:String xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">item1</ns1:String>
        <ns1:String xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">item2</ns1:String>
        <ns1:String xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">item3</ns1:String>
    </x:Array>
</ns0:CustomActivity>

这是不包含 ContentPropertyAttribute 属性的序列化版本。 注意示例中的属性加粗元素。

<?xml version="1.0" encoding="utf-16"?><ns0:CustomActivity x:Name="CustomActivity" 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">
    <ns0:CustomActivity.Items Type="{x:Type p3:String}" xmlns:p3="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <ns1:String xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">item1</ns1:String>
        <ns1:String xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">item2</ns1:String>
        <ns1:String xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">item3</ns1:String>
    </ns0:CustomActivity.Items>
</ns0:CustomActivity>

请参见

概念

如何:序列化工作流

Footer image

版权所有 (C) 2007 Microsoft Corporation。保留所有权利。