设为首页 收藏本站
查看: 604|回复: 0

[经验分享] SharePoint工作流开发点滴(4)

[复制链接]

尚未签到

发表于 2015-9-26 12:44:26 | 显示全部楼层 |阅读模式
  最近在开发SharePoint工作流总是发生一个错误 :工作流开始之后便显示"已完成"或者开始之后报错"内部错误".
  查看当时的日志,发现下面的段落:

  02/06/2007 10:31:03.92         w3wp.exe (0x0758)         
  0x0F3C        Windows SharePoint Services         Workflow Infrastructure         72eo        Unexpected         
  DehydrateInstance: System.Runtime.Serialization.SerializationException: 在分析完成之前就遇到流结尾。
  在 System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
  在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
  在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
  在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
  在 System.Workflow.ComponentModel.Activity.Load(Stream stream, Activity outerActivity, IFormatter formatter)...         
  
  
  02/06/2007 10:31:03.92*        w3wp.exe (0x0758)         
  0x0F3C        Windows SharePoint Services         Workflow Infrastructure         72eo        Unexpected        ...
  在 System.Workflow.ComponentModel.Activity.Load(Stream stream, Activity outerActivity)
  在 System.Workflow.Runtime.Hosting.WorkflowPersistenceService.RestoreFromDefaultSerializedForm(Byte[] activityBytes, Activity outerActivity)
  在 Microsoft.SharePoint.Workflow.SPWinOePersistenceService.LoadWorkflowInstanceState(Guid instanceId)
  在 System.Workflow.Runtime.WorkflowRuntime.InitializeExecutor(Guid instanceId, CreationContext context, WorkflowExecutor executor, WorkflowInstance workflowInstance)
  在 System.Workflow.Runtime.WorkflowRuntime.Load(Guid key, CreationContext context, WorkflowInstance workflowInstance) 在 System.Workflow.Runtime.WorkflowRuntime.GetWorkflow(Guid instanceId)
  在 Microsoft.SharePoint.Workflow.SPWinOeHostServices.DehydrateInstance(SPWorkflowInstance wo...         
  
  02/06/2007 10:31:03.92*        w3wp.exe (0x0758)         
  0x0F3C        Windows SharePoint Services         Workflow Infrastructure         72eo        Unexpected        ...rkflow)
  
  
  02/06/2007 10:31:03.93         w3wp.exe (0x0758)         
  0x0F3C        Windows SharePoint Services         Workflow Infrastructure         88xr        Unexpected        WinWF Internal Error, terminating workflow Id# 472dae03-5465-4f04-876f-d4cc4caa902a
  看里边最长的一段中文描述:"在分析完成之前就遇到流结尾",如果是SharePoint英文版,这段错误信息应该是"End of Stream encountered before parsing was completed".
  也就是说Workflow Runtime根本就没有完整的分析完整个流程.
  再看这句中文之前的英文:"DehydrateInstance: System.Runtime.Serialization.SerializationException".
  原来工作流是在钝化实例的时候发生了序列化异常.
  回想一下工作流的持久性,Workflow Runtime会把空闲的工作流数据序列化为XML形式,然后把工作流实例从内存中清除,等到需要的时候再将其反序列化加载到内存.
  会不会是因为我在工作流项目中添加了自定义类,而这个类又不支持序列化,所以导致工作流序列化失败?
  在工作流中使用InfoPath Initiation(或者Association)表单时需要为其生成一个类,观察这个类,发现这个用XSD生成的类有如下特性来修饰:

  [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
  [System.SerializableAttribute()]
  [System.Diagnostics.DebuggerStepThroughAttribute()]
  [System.ComponentModel.DesignerCategoryAttribute("code")]
  [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
  [System.Xml.Serialization.XmlRootAttribute(Namespace="http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-01-30T13:00:28", IsNullable=false)]
  下面来逐行分析一下:
  [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
  表示这个类是由XSD工具生成的.
  [System.SerializableAttribute()]
  表示这个类可以被序列化,我想关键就在这里.
  [System.Diagnostics.DebuggerStepThroughAttribute()]
  表示调试器会自动忽略被修饰的类内部的断点
  [System.ComponentModel.DesignerCategoryAttribute("code")]
  表示设计器的类别是"code"
  [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
  表示系列化时生成的XSD架构是匿名类型
  [System.Xml.Serialization.XmlRootAttribute(Namespace="http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-01-30T13:00:28", IsNullable=false)]
  设置序列化时根元素的命名空间
  删去或修改我们不需要的特性(比如第一项),将其插入到我们的自定义类中,工作流就正常了.
  
  update 2008.12.25

  • 其实只需要将自定义类标识为[Serializable]即可。
  • 其实不仅是自定义类,只要是在工作流类中的类级别变量,都必须实现了ISerializable的,而方法内的局部变量则可以不支持序列化。否则工作流在进行钝化是无法序列化某些变量,也会导致这个错误。比如在工作流累中定义了一个XmlDocument,就会发生此错误。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-119109-1-1.html 上篇帖子: SharePoint 2010:自定义XSLT List View webpart的行为和样式 下篇帖子: [SharePoint]使用代码获取Document Set对象信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表