Question

Je suis l'exception suivante:

System.Workflow.Runtime.Hosting.PersistenceException: Type « Microsoft.SharePoint.SPWeb » à l'Assemblée « Microsoft.SharePoint, Version = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c » est pas marqué comme sérialisable. -> System.Runtime.Serialization.SerializationException: Type « Microsoft.SharePoint.SPWeb » à l'Assemblée « Microsoft.SharePoint, Version = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c » est pas marqué comme sérialisable

L'erreur est venue d'ici:

public sealed partial class MyWorkflow : StateMachineWorkflowActivity
{
    public SPWorkflowActiviationProperties workflowProperties = new SPWorkflowActivationProperties();
    private SPWeb spWebtemp;

    private SPWeb spWeb
    {
        get { return spWebtemp ?? (spWebtemp = workflowProperties.Web); }
    }

    ...

Il y a deux messages de blog que j'ai trouvé:

Il y a une solution à trouver à ce problème: Ne pas avoir des objets membres complexes comme des variables globales , mais comme des variables locales - à savoir déclarer SPWeb localement (workflowProperties.Web) plutôt que sur une approche globale niveau.

Je dois donc redéclarer SPWeb dans chaque méthode que je me sers -. Que je considère plutôt laid

Ce que je aussi essayé est le suivant:

...
[NonSerialized]
private SPWeb spWebtemp;

private SPWeb spWeb
{
    get { return spWebtemp ?? (spWebtemp = workflowProperties.Web); }
}
...

==> pas exception plus de sérialisation!

Y a-t-il des implications négatives lors de l'utilisation de l'attribut NonSerialized sur ce domaine? Ou en d'autres termes - quelles sont les implications

?
Était-ce utile?

La solution

Pourquoi faites-vous tout simplement pas:

private SPWeb spWeb
{
    get { return workflowProperties.Web; }
}

la charge paresseux de l'objet SPWeb est déjà assurée par l'établissement de propriétés

Autres conseils

Cela ressemble à ce serait aussi aussi le travail (l'attribut OnDeserialized):

http://msdn.microsoft.com/ fr-fr / bibliothèque / system.runtime.serialization.ondeserializedattribute.aspx

[EDIT]

Je n'ai pas testé, mais je pense quelque chose comme ceci:

public sealed partial class MyWorkflow : StateMachineWorkflowActivity
{

public SPWorkflowActiviationProperties workflowProperties = new SPWorkflowActivationProperties();

[NonSerialized()]
private SPWeb spWebtemp;

private SPWeb spWeb
{
    get { return spWebtemp ?? (spWebtemp = workflowProperties.Web); }
}

[OnDeserialized()]
internal void OnDeserializedMethod(StreamingContext context)
{
    spWebTemp = workflowProperties.Web;
}


...

En outre, pourquoi ne pas initialiser l'objet spWebtemp dans le constructeur, ou est-ce pas possible avec les flux de travail?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top