SerializationException flux de travail en raison de l'objet complexe
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é:
- ... est pas marqué comme sérialisable
- sérialisation problème avec Windows workflow Foundation et flux de travail Sharepoint
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
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):
[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?