0

我创建了一个 BPMN 协作模型,其中包含一个 Javascript 类型的脚本任务。然后我用这样的流程变量实例化了一个流程实例:

Variable name: arr
Object type name: java.util.ArrayList
Serialization Data Format: application/x-java-serialized-object
Value: [{ "id": 10 }]

然后我使用以下代码传递了脚本任务:

var arr = execution.getVariable("arr");
execution.setVariable("arr2", arr);

它运行成功。然后我修改了这样的脚本任务:

var arr = execution.getVariable("arr");
arr.add({ "id" : 2 });
execution.setVariable("arr2", arr);

并重新部署,重新实例化;令我惊讶的是,它导致了一个错误:

无法提交任务表单 xxx:无法序列化变量“arr”中的对象:jdk.nashorn.internal.scripts.JO4

有人可以告诉我我做错了什么吗?

[更新]

我刚刚发现了一些新的东西,如果我像这样修改 ArrayList:

var arr = execution.getVariable("arr");
arr.add(2);
execution.setVariable("arr2", arr);

它工作得很好!修改后的值为:

[{ "id": 10 }, 2]

这意味着setVariable序列化修改后的列表有问题。那么我应该如何序列化呢?

4

1 回答 1

2

基本上这与此处描述的问题相同。我们在这里处理的不是用 Javascript 创建的数组,而是一个对象,显然 Nashorn 在内部表示为该类的一个实例,jdk.nashorn.internal.scripts.JO4并且流程引擎无法序列化它(JDK >= 8u40,一个JO4实例被包装在ScriptObjectMirror调用Java方法时的实例,但问题相同)。

要创建 Java 类的实例,可以使用以下代码:

var HashMap = Java.type("java.util.HashMap");
var instance = new HashMap();
instance.id = 2;
arr.add(instance);
execution.setVariable("arr2", arr);

资料来源:Nashorn 文档

于 2015-10-06T12:20:46.477 回答