Partager via


Comment : sérialiser des workflows

L'infrastructure Windows Workflow Foundation fournit une infrastructure de sérialisation utilisée pour sérialiser et désérialiser un workflow. Par défaut, un workflow est sérialisé dans la balise de workflow d'après certaines règles de mise en forme.

Sérialisation par défaut

Les développeurs de nouvelles activités appliquent automatiquement la sérialisation par défaut à la balise de workflow. Cette sérialisation par défaut devrait être suffisante pour la plupart des activités mais un sérialiseur personnalisé est parfois nécessaire.

L'exemple suivant montre comment utiliser la classe WorkflowMarkupSerializer pour sérialiser un workflow.

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())

Infrastructure de sérialisation

L'infrastructure de sérialisation par défaut de Windows Workflow Foundation fournit tous les types requis pour sérialiser les activités par défaut. Pour plus d'informations sur la définition des activités par défaut de l'infrastructure Windows Workflow Foundation, consultez Activités Windows Workflow Foundation.

Les éléments suivants constituent les classes importantes de l'infrastructure de sérialisation :

  • La classe WorkflowMarkupSerializer représente le type de sérialisation de base utilisé dans l'infrastructure de sérialisation. Ce type fournit quelques-uns des services de base de la sérialisation qui implémentent les règles de sérialisation. Les sérialiseurs d'activités ou tout autre sérialiseur personnalisé pour les activités personnalisées doivent hériter de cette classe.

  • La classe ActivityMarkupSerializer hérite de la classe WorkflowMarkupSerializer. Ce type est utilisé pour sérialiser toutes les activités de base. Ces activités ne sont pas composites.

  • La classe CompositeActivityMarkupSerializer hérite de la classe ActivityMarkupSerializer et fournit la sérialisation des activités composites. CompositeActivityMarkupSerializer ajoute plus de méthodes pour traiter des activités enfants, qui peuvent être sérialisées en utilisant leurs propres fournisseurs de sérialisation.

Règles de mise en forme de la sérialisation

La balise de workflow représente la forme sérialisée des hiérarchies d'objets. La façon dont un objet est sérialisé dépend de ses propriétés. Deux règles principales permettent la sérialisation d'instances de type :

  • La définition du type d'objet est le nom de l'élément en XAML.

  • Les propriétés de l'objet correspondent aux attributs de la définition du type d'élément en XAML.

L'exemple de code suivant illustre la sérialisation d'un objet.

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

Une instance de cette classe est sérialisée, tel qu'indiqué dans l'exemple de code XAML suivant.

<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" />

L'exemple de code montre que les deux propriétés de chaîne ExampleProperty et ExampleOtherProperty deviennent des attributs de l'élément ExampleActivity. Les valeurs "SomeValue" et "SomeOtherValue" sont les valeurs réelles des deux champs.

Bien sûr, une définition de classe peut être beaucoup plus complexe que la classe ExampleActivity de l'exemple de code. D'autres règles s'appliquent dans la sérialisation d'objets plus complexes.

NoteRemarque :

WorkflowMarkupSerializer ne prend pas en charge la sérialisation des types imbriqués. Par exemple, si vous créez une activité personnalisée et que vous définissez un type imbriqué dans cette activité, vous recevrez une erreur au moment de la compilation.

Sérialisation personnalisée

Vous pouvez personnaliser le format de sérialisation. La personnalisation peut s'effectuer à deux niveaux. Une nouvelle infrastructure de sérialisation peut être fournie, qui inclut un format de sérialisation personnalisé et une sérialisation pour chaque type. L'autre sérialisation peut être faite au niveau des activités. L'infrastructure de sérialisation est toujours la balise de workflow telle que fournie par l'infrastructure de création Windows Workflow Foundation, mais la mise en page d'activité individuelle peut être modifiée.

Personnalisation d'activités

Si vous créez un sérialiseur personnalisé, les auteurs d'activité doivent fournir une référence au sérialiseur personnalisé comme illustré dans l'exemple de code suivant.

[DesignerSerializer(typeof(ExampleActivityMarkupSerializer), typeof(WorkflowMarkupSerializer))]
public class ExampleActivity : Activity
{
}
<DesignerSerializer(GetType(ExampleActivityMarkupSerializer), GetType(WorkflowMarkupSerializer))> _
Public Class ExampleActivity 
    Inherits Activity

End Class

Le sérialiseur est spécifié en utilisant l'attribut DesignerSerializer qui comprend deux paramètres :

  • Le premier paramètre spécifie le sérialiseur qui doit être utilisé pour sérialiser l'instance de la classe sur laquelle l'attribut a été défini.

  • Le deuxième paramètre spécifie le type de base du sérialiseur. Le type de base du sérialiseur spécifie le schéma de sérialisation à utiliser.

Dans l'exemple de code DesignerSerializer, le deuxième attribut spécifie WorkflowMarkupSerializer. Cela signifie que l'infrastructure de sérialisation de base à utiliser est basée sur WorkflowMarkupSerializer.

Définition du sérialiseur personnalisé

Le sérialiseur personnalisé représente une classe qui doit être héritée d'un type de sérialisation de base. Dans l'exemple de code DesignerSerializer, ExampleActivityMarkupSerializer est un sérialiseur personnalisé pour la classe ExampleActivity. ExampleActivityMarkupSerializer hérite de WorkflowMarkupSerializer qui est le deuxième paramètre de l'attribut.

Lorsque le gestionnaire de sérialisation commence à sérialiser une activité, il utilise la définition de classe pour déterminer le type de sérialiseur personnalisé en recherchant le type de base du WorkflowMarkupSerializer dans le deuxième paramètre de l'attribut DesignerSerializer. Il obtient alors une instance du sérialiseur et l'utilise.

Balise de workflow

La balise de workflow décrit les workflows qui peuvent être exécutés par le moteur d'exécution Windows Workflow Foundation. Il s'agit d'un schéma de sérialisation de composants utilisé pour décrire les hiérarchies d'activité qui composent des workflows et la logique associée activée lorsque les activités déclenchent des événements.

La balise de workflow ne dispose pas d'une grammaire fixe pour le décrire. Elle définit un schéma général qui peut être utilisé pour représenter une hiérarchie d'objets ainsi que leurs propriétés et méthodes. Chaque activité est dotée d'une logique de sérialisation qui active les métadonnées d'activité à représenter dans la balise définie pour l'objet.

Pour plus d'informations, consultez Utilisation de la balise de workflow.

Voir aussi

Référence

System.Workflow.ComponentModel.Serialization

Concepts

Sérialisation d'activités personnalisées
Comment : compiler des workflows
Utilisation de la balise de workflow

Autres ressources

Développement de workflows

Footer image

Copyright ©2007 par Microsoft Corporation. Tous droits réservés.