WF随笔系列之二:架构、编译、序列化

2024-04-17 01:18

本文主要是介绍WF随笔系列之二:架构、编译、序列化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来源:BrianLei Blog - 博客园
  WF随笔系列之二,我们谈三个话题
  1.Windows Workflow Foundation架构图
-----Workflow与host交互的例子
  2.Windows Workflow Foundation的编译
  3.Windows Workflow Foundation Serialization话题
------如何序列化Workflow和以及反序列化
 2.1 Windows Workflow Foundation架构图:

  补充,运行时引擎:

  其实,在完成、失败和空闲的几种工作流实例的状态下,工作流运行时引擎应该表现出几种不同的事件。
如:

WorkflowAborted
WorkflowCompleted
WorkflowCreated
  事实上,workflow不是孤立运行的。因为WF在一个工作流实例和它的host之间提供了一些机制可以相互通信。那在工作流的内部或者外部,也提供很多的通讯方法能够让你快速和容易的传递数据,同时在一个工作流的环境外部,也有许多的可定制的方法能够支持你处理额外的事件和调用。

  2.2 Workflow与host交互的例子
首先,创建SequentialConsoleApplication工程,然后在Workflow1.cs[Design]拖一个Code,双击codeActivity1,在后台代码中,建立三个私有字段
private int A,B,C;
public int C { get { return OutputResult; } }
public int B { set { B = value; } }
public int A { set { A = value; } }
在ExecuteCode方法
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
C = A + B;
Console.WriteLine("At First,ExecuteCodeActivity1");
}

  在Program.cs Main方法中
  1. 声明一个 Dictionary
  2. 针对以上codeActivtiy1.cs建立字段,添加A,B元素的Value
Dictionary parameters = new Dictionary();

parameters["A"] = 11;
parameters["B"] = 22;
  3. 完成CreateWorkflow,以及WorkflowCompleted事件
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(CFirstSequentialWFConsoleApplication.Workflow1), parameters);

instance.Start();

workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { Console.WriteLine(e.OutputParameters["C"]); };

  至此,Workflow与host的Communication就完成。
当你在Host 应用程序中启动Workflow时,会直接调用WorkflowRuntime类中的CreateWorkflow方法,然后通过Dictionary实例把需要操作的数据传输到Workflow中进行相应处理,最后在WorkflowCompleted事件中获得操作之后的结果。

  2.3 Windows Workflow Foundation的编译
  在.net程序集中编译工作流,一般是这样顺序
  首先,workflow 编译,在这其中会包括Activity 验正,Activity代码的生成
  然后, 经过语言编译(这里的语言指的C#,VB.net等等),最后形成.net程序集。
  那编译完成之后,如何进行调用,其次就是实例化一个Runtime即可,然后调用startRuntime(),就OK了。

  2.4 Windows Workflow Foundation Serialization话题
WWF FrameWork提供序列化的机制,workflow和activity都是可以进行序列化和反序列化。另外RuleConditions and RuleSets 也是可以序列化成 .rules 文件关联Workflow.

  序列化类
System.Workflow.ComponentModel.Serialization
在Serialization命名空间下有三个Serializer:

WorkflowMarkupSerializer
  此类是Windows Workflow Foundation 所有序列化类的基类。你能使用其对workflows和activities进行序列化,序列化成xoml文件。当然,你也能把xoml文件反序列化成workflows和activites.
ActivityMarkupSerializer
针对于Activity序列化
CompositeActivityMarkupSerializer
针对于CompositeActivity序列化
当然也可以自定义序列化,如何自定义序列化?

  直接在你要序列化类上面,加一个属性,然后在进行相应的Coding。
举例如下:

[DesignerSerializer(typeof(CustomSerializer),typeof(WorkflowMarkupSerializer))]
public class workflow
{

.//Coding

}

  以上属性中第一参数是需要序列化的类,第二参数是代表第一个参数的基类型。    2.5 如何序列化Workflow和以及反序列化
首先建立一个WorkflowActivityLibrary项目
然后Activity1属性中,Base Class选择System.Workflow.ComponentModel.Activity
再建立一个WorkflowConsoleApplication项目
最后在Main方法直接Coding,代码如下
using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e)
{
Console.WriteLine("Workflow completed.");
waitHandle.Set();
};

 //创建Workflow
 Console.WriteLine("Creating workflow.");
 SequentialWorkflowActivity workflow = new SequentialWorkflowActivity();
 workflow.Name = "created workflow";
 workflow.Description = "created workflow for XOML activation";
 Activity activity = new Activity();
 activity.Name = "ConsoleActivity1";
 workflow.Activities.Add(activity); .
}
  序列化workflow到Xoml
WorkflowMarkupSerializer serializer = new WorkflowMarkupSerializer();
using (XmlWriter writer = XmlWriter.Create(workflowFilename))
{
 DesignerSerializationManager serializationManager = new DesignerSerializationManager();
/**CreateSession()创建新序列化会话。
 using (serializationManager.CreateSession())
 {
 serializer.Serialize(serializationManager, writer, workflow);
 //当然要检查在序列化中发生错误时,就可以给于相应的提示信息或者记录日志什么的,
 //那在DesignerSerializationManager类中有一个公共属性Errors,
 //公共属性Errors是获取在序列化或反序列化期间发生的错误的列表。
 if (serializationManager.Errors.Count > 0)
 {
 Console.WriteLine(String.Format("序列化时出错!{0}", serializationManager.Errors.Count));
 return;
 }
 }
 }
反序列化文件到workflow

//创建Workflow实例
 WorkflowInstance deserializedWorkflow = null;
 try
 {
 using (XmlReader reader = XmlReader.Create(workflowFilename))
 {
 deserializedWorkflow = workflowRuntime.CreateWorkflow(reader);
 }
 }
 catch (WorkflowValidationFailedException exp)
 {
  return;
 }
序列化之后,会生成一个.Xoml 文件,以下是内容


x:Name="created workflow"
Description="created workflow for XAML activation" xmlns:ns0="clr-namespace:Microsoft.Samples.Workflow.WorkflowSerialization; Assembly=CustomActivity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">


  其实大家看一下序列化之后的Xoml文件,可发现
  1.在XOML中对象类型是为xml节点名 如:x:Name,Description
  2.在XOML中对象属性值是xml节点的属性值 如:created workflow
  3.在XOML中还包括 ,这个就是我们在上面添加的子Activity.
  其实,有关于序列化还是有许多可讲的,我在以后会进行穿插的。

CreateSession()补充:
序列化管理器中的大多数数据都是瞬态的,只在序列化会话期间存活。
当释放某个会话时,会认为序列化已经完成,并且会清除该瞬态。
这允许使用序列化管理器的一个实例序列化多个对象树。
有的状态(包括服务提供程序和添加到序列化管理器的任何自定义的序列化提供程序)是跨会话的。

  引文:
  DesignerSerializationManager 类基于序列化会话这一理念。
  会话维护可由各种序列化程序访问的状态。当释放会话时,该状态会损坏。
  这有助于确保序列化程序主要保持无状态,并且有助于清理已经损坏的序列化程序。

  DesignerSerializationManager 类可实现三个目标:
  它是一个简单的总控对象,可以用来对各种格式进行反序列化。
  它是通用的,不绑定到任何特定格式。对于 CodeDOM 反序列化以及标记反序列化,它的使用方式相同。

  它是可扩展的,并且支持在复制/粘贴和撤消/重复方案中使用的不同序列化方法。
设计时序列化与运行时对象序列化具有下列不同之处:
  执行序列化的对象通常与运行时对象是分离的,因此,可从组件中移除设计时逻辑。
  序列化方案假定将要创建完全初始化的对象,然后在反序列化期间通过属性和方法调用对其进行修改。

  如果对象的属性具有从未在该对象上设置过的值(这些属性包含默认值),就不会对这些属性进行序列化。相反,反序列化流可能会有漏洞。
  重点是序列化流中的内容的质量,而不是对象的完全序列化。
  这表示,如果没有定义序列化对象的方法,则可以跳过该对象,否则会引发异常。
  序列化引擎可以在这里提供试探法来确定可以忽略哪些失败以及哪些失败不可恢复。
  序列化流具有的数据可能多于反序列化所需的数据。
例如,源代码序列化已将用户代码与反序列化对象图所需的代码混合。
  对于反序列化,必须忽略该用户代码,而对于序列化,必须保留该用户代码。

这篇关于WF随笔系列之二:架构、编译、序列化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/910418

相关文章

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保