问题描述
|
我有以下异常:
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对象,或者在工作流中不能这样做呢?