我有一个流程,其中发生以下情况:
PartyA
创建TransactionBuilder
PartyA
将TransactionBuilder
发送给PartyB
PartyB
将状态添加到TransactionBuilder
但是,当PartyB
向构建器尝试某个状态时,它们会出现以下异常:
[WARN ] 2018-03-20T16:02:35,932Z [Node thread-1] flow.[99246baf-1a1d-44e5-b2f9-f4eb341b97d4].run - Terminated by unexpected exception {}
java.lang.UnsupportedOperationException: null
at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055) ~[?:1.8.0_162]
at net.corda.core.transactions.TransactionBuilder.addInputState(TransactionBuilder.kt:149) ~[corda-core-corda-3.0.jar:?]
这里发生了什么?为什么PartyB
无法TransactionBuilder
添加项目?
答案 0 :(得分:5)
在Corda中,对象在通过线路发送之前被序列化。在对接收的对象进行反序列化时,无法检测正在反序列化的任何List
是否最初是可变的或不可变的。总的来说,我们决定我们的序列化引擎应该使任何List
反序列化为不可变的,而不是可变的。
这导致您在上面发现的问题。在引擎盖下,您在不可变列表上调用add
。
您可以使用TransactionBuilder.copy
绕过此问题,以复制具有可变状态列表的TransactionBuilder
。
答案 1 :(得分:1)
问题仅发生在Corda V3中,其中往返序列化将可变对象转换为非可变对象。在Corda V2或更低版本中不是这种情况。