Stefan Frutigers Blog

über die Programmierung von SharePoint, Workflows, Office

SharePoint Objekte lassen sich oft nicht serialisieren

Gerade im Zusammenhang mit SharePoint Workflows ist es unabdingbar, dass sich die Workflow Variablen serialisieren lassen, weil sich der Workflow ab und zu schlafen legt (Serialisierung der Variablen), bis ein gewisses Ereignis, beispielsweise das Abschliessen einer Aufgabe, eintritt und der Workflow fortgeführt wird (Deserialisierung der Variablen).

Microsoft gibt uns zwar mit den Workflow Properties (SPWorkflowActivationProperties) ein Objekt in die Hand, das von der Ereignis Aktivität OnWorkflowActivated abgefüllt wird. Wir müssen uns nicht um die Serialisierung der Properties (wie Site, Web, List, Item) kümmern. Dies wird automatisch für uns gemacht.

Wenn wir nun aber in unserem Workflow eine weitere Variable vom Typ SPListItem benötigen, die nicht über die Workflow Properties erreichbar ist, müssen wir selber dafür sorgen, dass die Variable beim Fortführen des Workflows korrekt initialisiert wird. Dazu ein kleiner Code Ausschnitt:

public int ItemID = -1;

[NonSerialized()]
private SPListItem _item;

public SPListItem DuplicateItem
{
    get
    {
        if (_item == null && ItemID != -1)
            _item = LoadListItem(ItemID); // ToDo: Implement LoadListItem()

        return _item;
    }
    set
    {
        _item = value;

        if (_item != null)
            ItemID = _item.ID;
    }
}

Zuerst benötigen wir eine Integer Variable ItemID für die eindeutige Identifikation des Items. Um die Serialisierung dieser Variable brauchen wir uns nicht zu kümmern.

Danach deklarieren wir eine private Variable _item vom Typ SPListItem, die das List Item zur Laufzeit zur Verfügung stellt, die aber nicht serialisierbar ist. Darum wird die Variable mit dem NonSerialized Attribut dekoriert.

Schlussendlich müssen wir noch eine Property Item implementieren, die bei Bedarf das List Item nachlädt (nämlich genau dann, wenn der Workflow fortgeführt wird und alle Variablen deserialisert werden). Zu diesem Zweck muss noch die LoadListItem Funktion implementiert werden, die anhand der List Item ID ein List Item zurückgibt.

Kommentare

Keine Kommentare

Kommentar abgeben

(verpflichtend) 

(verpflichtend) 

(optional)

(verpflichtend)