如何解决由于复杂对象而导致工作流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对象,或者在工作流中不能这样做呢?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。