org.activiti.engine.ActivitiException: coudn‘t deserialize object in variable ‘a‘.获取流程变量无法反序列化问题。
1.首先看我的javabean类
package cn.itcast.process_variables;
import java.io.Serializable;
//序列化javabean,这样流程变量的值才可以直接使用该类的对象
public class Person implements Serializable{
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
}
2.设置流程变量
//设置流程变量
@Test
public void setProcessVariables(){
TaskService taskService = processEngine.getTaskService();
String taskId = "52504";
//设置流程变量,使用基本数据类型
/*taskService.setVariableLocal("42502", "请假天数", 5);//local表示与当前任务绑定,当该任务完成之后,该流程变量会被删除
taskService.setVariable("42502", "请假日期", new Date());
taskService.setVariable("42502", "请假原因", "回家探亲,一起吃个饭");
//如果流程变量绑定了任务id,那么在下一次任务改变了其值的时候,流程变量的历史表中会有两条结果,如果没有绑定,再次赋值时则直接覆盖掉原来的值即可
//当流程结束,所有流程变量都从正在执行的流程流量表中被删除。
*/
//设置流程变量,使用javabean
Person person = new Person();
person.setId(10);
person.setName("翠花");
taskService.setVariable(taskId, "人员信息", person);
System.out.println("设置流程变量成功");
}
3.获取流程变量
//获取流程变量
@Test
public void getProcessVariables(){
TaskService taskService = processEngine.getTaskService();
String taskId = "52504";
/*获取流程变量,使用基本数据类型*/
/*Integer days = (Integer)taskService.getVariable(taskId, "请假天数");
Date date = (Date)taskService.getVariable(taskId, "请假日期");
String reason = (String)taskService.getVariable(taskId, "请假原因");
System.out.println( "请假天数:"+days);
System.out.println( "请假日期:"+date);
System.out.println( "请假原因:"+reason);*/
//获取流程变量,使用javabean类型
Person person = (Person)taskService.getVariable(taskId, "人员信息");
System.out.println(person);
System.out.println("获取流程变量成功");
}
看上面代码是没有任何问题的,关键是我在运行的时候操作有点问题,刚开始的Person类我并没有加toString()这个方法,然后我就运行了setProcessVariables()设置流程变量这个方法,这个时候没有任何问题,流程变量也设置得很成功,然后最关键的错误就在于我设置完流程变量后,然后又在Person类里面加了一个toString方法,然后再运行获取流程变量的那个方法,结果成功报错**org.activiti.engine.ActivitiException:coudn’t deserialize object in variable ‘**人员信息’。
然后在网上查了很多反序列不成功的原因,都没有解决这个问题。
后来突然想到自己写的代码和视频教程里面的就差一个toString()方法,所以就把原因归咎到它的身上了。
于是我重新运行了一下设置流程变量的方法,然后再获取,这个时候就没有什么问题了,所以其实就是你设置流程变量时那个类是什么样子,在获取的时候还是那个样子,就不会出错,不要瞎改。还有注意就是类一定要实现序列化的接口。
4.个人对错误的理解和小总结
错误原因在于,你通过序列化存在数据库的对象的结构等到时候再获取的时候是不能改变的,不然就好像你小时候买了一双鞋子然后放在你亲戚家,几年后你再拿出来穿,发现居然穿不上了,因为脚长大了。虽然只是小错误,但还是花费了我一些时间的。
5.一劳永逸的方法
package cn.itcast.process_variables;
import java.io.Serializable;
//序列化javabean,这样流程变量的值才可以直接使用该类的对象
public class Person implements Serializable{
/**
* 生成序列化的版本id,这样在设置流程变量之后再修改类也不会在获取流程变量的时候出现问题了。
*/
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
}
5.序列化和反序列化理解
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。
总结:核心作用就是对象状态的保存和重建。
更多推荐
所有评论(0)