Compartir a través de


Serialización de las actividades personalizadas

Cada actividad tiene lógica de serialización que permite representar los metadatos de actividad en un marcado de flujo de trabajo. Describe flujos de trabajo que pueden ser ejecutados por el motor de tiempo de ejecución de Windows Workflow Foundation. 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.

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 hay que crear un serializador personalizado. Para obtener más información acerca de la funcionalidad de serialización predeterminada usada por Windows Workflow Foundation, consulte Cómo serializar flujos de trabajo.

Al serializar propiedades de actividad en un diseñador, debe utilizar el atributo DesignerSerializationVisibilityAttribute para determinar si se serializará la propiedad (Visible), si no se serializará (Hidden) o si se serializará solamente el contenido de la propiedad (Content).

De forma predeterminada, todas las propiedades de actividad personalizadas se establecen en DesignerSerializationVisibility.Visible para que sean serializadas por el diseñador. Si desea serializar una propiedad de colección, como ArrayList, debe contener la propiedad con DesignerSerializationVisibility.Content para que se serialice el contenido de ArrayList. Si la propiedad no contiene este atributo, no se serializará su propiedad de colección. Para obtener más información acerca de la serialización del diseñador, consulte Designer Serialization Overview.

Serialización de tipos de datos genéricos

El atributo DesignerSerializationVisibilityAttribute se utiliza para serializar propiedades de actividades personalizadas; sin embargo, no se pueden serializar todos los tipos de datos. Por ejemplo, no se pueden serializar la mayoría de los tipos de datos genéricos. Sólo se pueden serializar los tipos de datos genéricos que heredan de IList o IDictionary. Si desea utilizar esos tipos de datos, debe seguir estas reglas:

  • El valor DesignerSerializationVisibility.Content debe estar contenido en la propiedad.

  • La propiedad es de sólo lectura.

DesignerSerializationVisibility.Content contra ContentPropertyAttribute

Al serializar propiedades en actividades personalizadas, tiene la opción de utilizar DesignerSerializationVisibility.Content y ContentPropertyAttribute. Aunque sean parecidos, son diferentes, y debe entender la diferencia antes de serializar sus actividades personalizadas, o recibirá resultados inesperados.

La diferencia entre DesignerSerializationVisibility.Content y ContentPropertyAttribute es que mientras que DesignerSerializationVisibility.Content serializa el contenido del tipo de datos de colección, ContentPropertyAttribute omite que se serialice un nombre de propiedad para aumentar la claridad de los datos serializados. Además, ContentPropertyAttribute está contenido en la clase, mientras que la propiedad contiene DesignerSerializationVisibility.Content. Una propiedad nunca debería contener ambos. Si lo hace, recibirá un error de compilación.

El ejemplo siguiente muestra una actividad personalizada que tiene una matriz de cadena. Muestra cómo los datos se serializan con y sin utilizar 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.
}

Ésta es la versión serializada que contiene el atributo 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>

Ésta es la versión serializada que no contiene el atributo ContentPropertyAttribute. Tenga en cuenta el elemento en negrita de la propiedad del ejemplo.

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

Consulte también

Conceptos

Cómo serializar flujos de trabajo

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.