由于复杂对象而导致工作流SerializationException

问题描述

| 我有以下异常:   System.Workflow.Runtime.Hosting.PersistenceException:在程序集“ Microsoft.SharePoint,版本= 12.0.0.0,文化=中性,PublicKeyToken = 71e9bce111e9429c”中键入“ Microsoft.SharePoint.SPWeb”未标记为可序列化。 —> System.Runtime.Serialization.SerializationException:在程序集“ Microsoft.SharePoint,版本= 12.0.0.0,文化=中性,PublicKeyToken = 71e9bce111e9429c”中键入“ Microsoft.SharePoint.SPWeb”未标记为可序列化 错误来自这里:
public sealed partial class MyWorkflow : StateMachineWorkflowActivity
{
    public SPWorkflowActiviationProperties workflowProperties = new SPWorkflowActivationProperties();
    private SPWeb spWebtemp;

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

    ...
我发现了两个博客文章: ...未标记为可序列化 Windows Workflow Foundation和Sharepoint工作流的序列化问题 有一个解决方案可以解决此问题:没有将复杂的成员对象作为全局变量,而是作为局部变量-即在本地而不是在全局级别上声明SPWeb(workflowProperties.Web)。 因此,我将不得不在所使用的每种方法中重新声明spWeb-我认为这很丑陋。 我还尝试过的是:
...
[NonSerialized]
private SPWeb spWebtemp;

private SPWeb spWeb
{
    get { return spWebtemp ?? (spWebtemp = workflowProperties.Web); }
}
...
==>不再有序列化异常! 在此字段上使用“ 2”属性时是否会有负面影响? 或者换句话说-含义是什么?     

解决方法

        为什么不简单地做:
private SPWeb spWeb
{
    get { return workflowProperties.Web; }
}
spweb对象的延迟加载已由properties属性处理     ,        看起来它也可以使用(OnDeserialized属性): http://msdn.microsoft.com/zh-CN/library/system.runtime.serialization.ondeserializedattribute.aspx [编辑] 我还没有测试过,但是我在想这样的事情:
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;
}


...
另外,为什么不在构造函数中初始化spWebtemp对象,或者在工作流中不能这样做呢?