0

我得到以下异常:

System.Workflow.Runtime.Hosting.PersistenceException:在程序集“Microsoft.SharePoint,Version=12.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c”中键入“Microsoft.SharePoint.SPWeb”未标记为可序列化。—> System.Runtime.Serialization.SerializationException:在程序集“Microsoft.SharePoint,Version=12.0.0.0,Culture=neutral,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); }
    }

    ...

我找到了两篇博文:

这个问题有一个解决方案:不要将复杂的成员对象作为全局变量,而是作为局部变量 - 即在本地(workflowProperties.Web)而不是在全局级别声明 SPWeb。

因此,我必须在我使用的每种方法中重新声明 spWeb - 我认为这很丑陋。

我也尝试过的是:

...
[NonSerialized]
private SPWeb spWebtemp;

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

==> 没有更多的序列化异常!

NonSerialized在此字段上使用属性时是否有任何负面影响?
或者换句话说 - 有什么影响?

4

2 回答 2

1

你为什么不干脆做:

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

spweb 对象的延迟加载已由 properties 属性处理

于 2011-06-15T08:47:16.907 回答
1

这看起来也可以工作(OnDeserialized Attribute):

http://msdn.microsoft.com/en-us/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 对象,或者这对工作流来说是不可能的?

于 2011-12-19T14:50:19.833 回答