Condividi tramite


Procedura: serializzare i flussi di lavoro

Il framework di Windows Workflow Foundation fornisce un'infrastruttura di serializzazione che viene utilizzata per serializzare e deserializzare un flusso di lavoro. Per impostazione predefinita, un flusso di lavoro viene serializzato in tag di flusso di lavoro in base a determinate regole di formattazione.

Serializzazione predefinita

Gli sviluppatori di nuove attività ottengono automaticamente la serializzazione predefinita con tag del flusso di lavoro. La serializzazione predefinita è in genere sufficiente per la maggior parte delle attività, ma in alcuni casi può essere necessario un serializzatore personalizzato.

Nell'esempio seguente viene illustrato come utilizzare la classe WorkflowMarkupSerializer per serializzare un flusso di lavoro.

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

Infrastruttura di serializzazione

L'infrastruttura di serializzazione predefinita di Windows Workflow Foundation fornisce tutti i tipi necessari per serializzare le attività predefinite. Per informazioni sull'insieme di attività predefinito del framework di Windows Workflow Foundation, vedere Attività di Windows Workflow Foundation.

Di seguito sono elencate le principali classi incluse nell'infrastruttura di serializzazione:

  • La classe WorkflowMarkupSerializer è il tipo di serializzazione di base utilizzato nell'infrastruttura di serializzazione. Questo tipo fornisce alcuni dei servizi di base per la serializzazione che implementano le regole di serializzazione. I serializzatori per le attività o qualsiasi altro serializzatore personalizzato per le attività personalizzate devono ereditare da questa classe.

  • La classe ActivityMarkupSerializer eredita dalla classe WorkflowMarkupSerializer. Questo tipo viene utilizzato per serializzare tutte le attività di base. Le attività di base sono attività non composte.

  • La classe CompositeActivityMarkupSerializer eredita dalla classe ActivityMarkupSerializer e fornisce la serializzazione per attività composte. La classe CompositeActivityMarkupSerializer aggiunge più metodi per elaborare attività figlio che possono essere serializzate utilizzando i relativi provider di serializzazione.

Regole del formato di serializzazione

Il tag del flusso di lavoro è la forma serializzata delle gerarchie di oggetti. La modalità di serializzazione di un oggetto dipende dalle proprietà dell'oggetto. Esistono due regole principali che consentono la serializzazione di istanze di tipo:

  • La definizione del tipo dell'oggetto è il nome dell'elemento in XAML.

  • Le proprietà dell'oggetto eseguono il mapping agli attributi sulla definizione dell'elemento in XAML.

Nell'esempio di codice seguente viene illustrata la serializzazione di un oggetto.

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

Viene serializzata un'istanza di questa classe, come mostrato nell'esempio di codice XAML seguente.

<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'esempio di codice mostra che due proprietà stringa, ExampleProperty e ExampleOtherProperty, diventano attributi dell'elemento ExampleActivity. I valori "SomeValue" e "SomeOtherValue" sono i valori effettivi per i due campi.

Una definizione di classe può essere ovviamente molto più complessa rispetto alla classe ExampleActivity riportata nell'esempio. Nella serializzazione di oggetti più complessi vengono applicate ulteriori regole.

Nota

WorkflowMarkupSerializer non supporta la serializzazione di tipi nidificati. Ad esempio, se si crea un'attività personalizzata e si definisce un tipo nidificato all'interno dell'attività, durante la fase di compilazione verrà restituito un errore.

Serializzazione personalizzata

È possibile personalizzare il formato di serializzazione. La personalizzazione può essere eseguita a due livelli. È possibile fornire un'intera infrastruttura di serializzazione completamente nuova che includa un formato di serializzazione personalizzato e una serializzazione per ogni tipo. L'altra serializzazione può essere eseguita a livello di attività. L'infrastruttura di serializzazione è ancora il tag del flusso di lavoro fornito dal framework di creazione di Windows Workflow Foundation, ma il layout delle singole attività può essere modificato.

Personalizzazione di attività

Se si crea un serializzatore personalizzato, l'autore dell'attività deve fornire un riferimento al serializzatore personalizzato come illustrato nell'esempio di codice seguente.

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

End Class

Il serializzatore viene specificato utilizzando l'attributo DesignerSerializer comprendente due parametri:

  • Il primo parametro specifica il serializzatore che deve essere utilizzato per serializzare l'istanza della classe nella quale è stato definito l'attributo.

  • Il secondo parametro specifica il tipo di basse del serializzatore. Il tipo di base del serializzatore specifica lo schema di serializzazione da utilizzare.

Nell'esempio di codice di DesignerSerializer, il secondo attributo specifica WorkflowMarkupSerializer. Ciò significa che l'infrastruttura di serializzazione di base da utilizzare è basata su WorkflowMarkupSerializer.

Definizione del serializzatore personalizzato

Il serializzatore personalizzato è una classe che deve essere ereditata da un tipo di serializzazione di base. Nell'esempio di codice di DesignerSerializer, ExampleActivityMarkupSerializer è un serializzatore personalizzato per la classe ExampleActivity. ExampleActivityMarkupSerializer eredita da WorkflowMarkupSerializer, il secondo parametro dell'attributo.

Quando il gestore della serializzazione avvia la serializzazione di un'attività, utilizza la definizione di classe per determinare il tipo di serializzatore personalizzato individuando il tipo di base della classe WorkflowMarkupSerializer nel secondo parametro dell'attributo DesignerSerializer. Ottiene e utilizza quindi un'istanza del serializzatore.

Tag del flusso di lavoro

Il tag del flusso di lavoro descrive i flussi di lavoro che possono essere eseguiti dal motore di runtime di Windows Workflow Foundation. Il tag del flusso di lavoro è una combinazione di componenti di serializzazione utilizzata per descrivere le gerarchie delle attività che costituiscono i flussi di lavoro e la logica associata attivata quando le attività generano eventi.

Non è disponibile alcuna grammatica specifica per descrivere il tag del flusso di lavoro. Il tag del flusso di lavoro definisce uno schema generale che può essere utilizzato per rappresentare una gerarchia di oggetti, unitamente ai relativi metodi e proprietà. Ogni attività dispone di una logica di serializzazione che consente ai metadati dell'attività di essere rappresentati in un tag definito per l'oggetto.

Per ulteriori informazioni, vedere Utilizzo dei markup del flusso di lavoro.

Vedere anche

Riferimenti

System.Workflow.ComponentModel.Serialization

Concetti

Serializzazione di attività personalizzate
Procedura: compilare flussi di lavoro
Utilizzo dei markup del flusso di lavoro

Altre risorse

Sviluppo dei flussi di lavoro

Footer image

Copyright © 2007 Microsoft Corporation. Tutti i diritti riservati.