Share via


Cómo serializar flujos de trabajo

El marco de Windows Workflow Foundation proporciona una infraestructura de serialización que se utiliza para serializar y deserializar un flujo de trabajo. De forma predeterminada, un flujo de trabajo se serializa como marcado de flujo de trabajo según ciertas reglas de formato.

Serialización predeterminada

Los programadores de nuevas actividades obtienen automáticamente la serialización predeterminada como marcado de flujo de trabajo. Esta serialización predeterminada debería ser suficiente para la mayoría de las actividades, pero a veces se podría necesitar un serializador personalizado.

A continuación se muestra un ejemplo de cómo usar la clase WorkflowMarkupSerializer para serializar un flujo de trabajo.

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

Infraestructura de serialización

La infraestructura de serialización predeterminada de Windows Workflow Foundation proporciona todos los tipos necesarios para serializar las actividades predeterminadas. Par obtener información acerca de la actividad predeterminada del marco de Windows Workflow Foundation establecida, consulte Actividades de Windows Workflow Foundation.

A continuación se muestran clases importantes en la infraestructura de serialización:

  • La clase WorkflowMarkupSerializer es el tipo de serialización base utilizado en la infraestructura de serialización. Este tipo proporciona algunos de los servicios básicos para la serialización que implementan las reglas de serialización. Los serializadores de actividades o cualquier otro serializador personalizado de actividades personalizadas deben heredar de esta clase.

  • La clase ActivityMarkupSerializer hereda de la clase WorkflowMarkupSerializer. Este tipo se usa para serializar todas las actividades básicas. Éstas son actividades que no son actividades compuestas.

  • La clase CompositeActivityMarkupSerializer hereda de la clase ActivityMarkupSerializer y proporciona la serialización para actividades compuestas. CompositeActivityMarkupSerializer agrega más métodos para procesar actividades secundarias, que se pueden serializar mediante sus propios proveedores de serialización.

Reglas de formato de serialización

El marcado de flujo de trabajo es la forma serializada de jerarquías de objeto. Cómo se serializa un objeto depende de las propiedades del objeto. Hay dos reglas principales que ayudan a la serialización de instancias de tipo:

  • La definición de tipo del objeto es el nombre de elemento en XAML.

  • Las propiedades del objeto asignan a los atributos en la definición de elemento en XAML.

En el ejemplo de código siguiente se muestra la serialización de un objeto.

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

Una instancia de esta clase se serializa como se muestra en el ejemplo de código XAML siguiente.

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

El ejemplo de código muestra que las dos propiedades de cadena, ExampleProperty y ExampleOtherProperty, se vuelven atributos del elemento ExampleActivity. Los valores "SomeValue" y "SomeOtherValue" son los valores reales de los dos campos.

Una definición de clase puede ser mucho más compleja que la clase ExampleActivity del ejemplo de código. Otras reglas se aplican en la serialización de objetos más complejos.

Nota

WorkflowMarkupSerializer no admite la serialización de tipos anidados. Por ejemplo, si crea una actividad personalizada y define un tipo anidado dentro de esa actividad, recibirá un error durante el tiempo de compilación.

Serialización personalizada

Puede personalizar el formato de serialización. La personalización se puede hacer en dos niveles. Se puede proporcionar una nueva infraestructura de serialización completa, que incluye un formato de serialización personalizado y una serialización para cada tipo. La otra serialización se puede hacer en el nivel de actividades. La infraestructura de serialización todavía es el marcado de flujo de trabajo tal y como es proporcionado por el marco de creación de Windows Workflow Foundation, pero se puede cambiar el diseño de actividad individual.

Actividades de personalización

Si crea un serializador personalizado, los creadores de actividad deben proporcionar una referencia al serializador personalizado tal y como se muestra en el ejemplo de código siguiente.

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

End Class

El serializador se especifica mediante el atributo DesignerSerializer, que tiene dos parámetros:

  • El primer parámetro especifica el serializador que se debería utilizar para serializar la instancia de la clase en la que se ha definido el atributo.

  • El segundo parámetro especifica el tipo base del serializador. El tipo base del serializador especifica el esquema de serialización que hay que utilizar.

En el ejemplo de código DesignerSerializer, el segundo atributo especifica WorkflowMarkupSerializer. Esto significa que la infraestructura de la serialización base que se va a utilizar está basada en WorkflowMarkupSerializer.

Definición del serializador personalizado

El serializador personalizado es una clase que se debe heredar de un tipo de serialización base. En el ejemplo de código DesignerSerializer, ExampleActivityMarkupSerializer es un serializador personalizado de la clase ExampleActivity. ExampleActivityMarkupSerializer hereda de WorkflowMarkupSerializer, que es el segundo parámetro del atributo.

Cuando el administrador de serialización empieza a serializar una actividad, utiliza la definición de clase para determinar el tipo de serializador personalizado buscando el tipo base de WorkflowMarkupSerializer en el segundo parámetro del atributo DesignerSerializer. Obtiene a continuación una instancia del serializador y la usa.

Marcado de flujo de trabajo

El marcado de flujo de trabajo describe flujos de trabajo que el motor de tiempo de ejecución de Windows Workflow Foundation puede ejecutar. El marcado de flujo de trabajo es un esquema de serialización de componente que se utiliza para describir las jerarquías de actividad que constituyen los flujos de trabajo y la lógica asociada que se activa cuando las actividades provocan eventos.

El marcado de flujo de trabajo no tiene ninguna gramática fija para describirlo. Define un esquema general que se puede utilizar para representar una jerarquía de objetos, junto con sus propiedades y métodos. Cada actividad tiene una lógica de serialización que permite que se representen los metadatos de actividad en marcado definido para el objeto.

Para obtener más información, consulte Uso del marcado de flujo de trabajo.

Consulte también

Referencia

System.Workflow.ComponentModel.Serialization

Conceptos

Serialización de las actividades personalizadas
Cómo compilar flujos de trabajo
Uso del marcado de flujo de trabajo

Otros recursos

Desarrollo de flujos de trabajo

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.