我正在尝试在 Camunda 进程中的 Javascript 的脚本任务中合并两个数组>。这是我的剧本:
var arr1 = execution.getVariableTyped("arr1", true);
var arr2 = execution.getVariableTyped("arr2", true);
var merged = [];
for (var i1 in arr1) {
var found = false;
for (var i2 in merged) {
if (arr1[i1].id == merged[i2].id) {
found = true;
break;
}
}
if (!found) {
merged.push(arr1[i1]);
}
}
for (var i1 in arr2) {
var found = false;
for (var i2 in merged) {
if (arr2[i1].id == merged[i2].id) {
found = true;
break;
}
}
if (!found) {
merged.push(arr2[i1]);
}
}
execution.setVariable("arr1", merged);
execution.removeVariable("arr2");
执行上述脚本时,会抛出异常:
无法完成任务b4fb856a-6a92-11e5-9774-005056c00008:不能 序列化变量'arr1'中的对象:SPIN / JACKSON-JSON-01009无法 将对象'jdk.nashorn.internal.objects.NativeArray@5ff42b74'映射到json 节点
为什么?有什么问题,我该如何解决?无论如何都要调试这样的脚本吗?
答案 0 :(得分:2)
Nashorn为Javascript数组提供类似NativeArray
的类,因为Javascript数组与Java中的String[]
之类的元素类型无关。因此,Nashorn创建了NativeArray
的实例。显然,流程引擎无法存储NativeArray
的实例,因为它没有实现java.io.Serializable
,也不能通过JSON和XML序列化程序进行序列化。实际上,JSON序列化程序会尝试这样做,但会抛出您看到的异常。
你可以做到
execution.setVariable("arr1", Java.to(merged, "java.lang.Object[]"));
将NativeArray
转换为Java Object[]
。如果要从Java代码访问该数组,可以使用更具体的类型化数组。资料来源:Nashorn documentation
注意:
对于 JDK 8版本> = 1.8u40 ,移交的类型不是NativeArray
,而是包含ScriptObjectMirror
的{{1}}实例(请参阅this question了解详情)。显然,可以使用相同的代码来解决问题。