Share via


カスタム アクティビティのシリアル化

各アクティビティには、アクティビティ メタデータをワークフローのマークアップで表現できるようにするシリアル化ロジックがあります。ワークフロー マークアップは、Windows Workflow Foundation ランタイム エンジンが実行できるワークフローを記述します。ワークフロー マークアップは、コンポーネント シリアル化スキームとして、ワークフローを形成するアクティビティ階層、およびアクティビティがイベントを発生させたときに起動される関連ロジックを記述するために使用されます。

新規アクティビティの開発者は、ワークフロー マークアップに対する既定のシリアル化を自動的に取得します。既定のシリアル化は、多くのアクティビティに十分に対応できますが、カスタム シリアライザの作成が必要な場合もあります。Windows Workflow Foundation が使用する既定のシリアル化機能の詳細については、「方法 : ワークフローをシリアル化する」を参照してください。

デザイナでアクティビティのプロパティをシリアル化する場合は、DesignerSerializationVisibilityAttribute 属性を使用して、プロパティをシリアル化するのか (Visible)、シリアル化しないのか (Hidden)、またはプロパティのコンテンツのみシリアル化するのか (Content) を決定する必要があります。

既定では、すべてのカスタム アクティビティのプロパティが DesignerSerializationVisibility.Visible に設定されており、デザイナによってシリアル化されます。ArrayList などのコレクション プロパティをシリアル化するには、プロパティを DesignerSerializationVisibility.Content で修飾して、ArrayList のコンテンツがシリアル化されるようにする必要があります。この属性を使用してプロパティを修飾しない場合、コレクション プロパティはシリアル化されません。デザイナのシリアル化の詳細については、「Designer Serialization Overview」を参照してください。

ジェネリック データ型のシリアル化

DesignerSerializationVisibilityAttribute 属性を使用して、カスタム アクティビティのプロパティをシリアル化しますが、すべてのデータ型をシリアル化できるわけではありません。たとえば、ほとんどのジェネリック データ型はシリアル化できません。シリアル化できるのは、IList または IDictionary を継承するジェネリック データ型のみです。これらのデータ型を使用する場合は、次のルールに従う必要があります。

  • DesignerSerializationVisibility.Content の値でプロパティを修飾する必要があります。

  • プロパティは読み取り専用です。

DesignerSerializationVisibility.Content と ContentPropertyAttribute の比較

カスタム アクティビティのプロパティをシリアル化する場合は、DesignerSerializationVisibility.ContentContentPropertyAttribute という 2 つのオプションがあります。この 2 つは似ているようですが異なります。その違いを理解しないでカスタム アクティビティをシリアル化すると、予期しない結果が得られます。

DesignerSerializationVisibility.ContentContentPropertyAttribute の違いは、DesignerSerializationVisibility.Content がコレクション データ型のコンテンツをシリアル化するのに対して、ContentPropertyAttribute は、シリアル化されたデータをよりわかりやすくするために、シリアル化するデータからプロパティ名を省略します。また、ContentPropertyAttribute がクラスを修飾するのに対して、DesignerSerializationVisibility.Content はプロパティを修飾します。この 2 つを使用して 1 つのプロパティを修飾しないでください。両方を使用すると、コンパイル エラーが発生します。

文字列配列を持つカスタム アクティビティの例を次に示します。ここでは、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 属性を含まないシリアル化されたバージョンです。例の中の太字の property 要素に注目してください。

<?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

Copyright © 2007 by Microsoft Corporation.All rights reserved.