corda 状态迁移中的 Kotlin 类型擦除错误

问题描述 投票:0回答:1

我有一个 Corda State CarA 具有字段 drivers:Set<CustomDriverClass>。但在下一个版本中,我想将 Set<CustomDriverClass> 的数据类型更改为 Set<String>。但 corda 不允许直接更改它 (参考:https://corda.net/blog/a-developers-primer-on-cordapp-upgrades/)。

所以,我添加了一个新的字段名称 => driversV2: Set<String> 并删除了 drivers 字段。然后为添加的这个新字段添加了一个 depreciatedDeserialisationConstructor(1)。

现在的问题是, “平台声明冲突:以下声明具有相同的 JVM 签名”发生。

问题原因:这是因为折旧构造函数的JVM签名和主状态类是一样的。它们之间的唯一区别是 Set 中的数据类型不同。

Set<CustomDriverClass> & Set<String>

由于 Kotlin 中的类型擦除而未被考虑。

快速修复:我通过简单地更改 driversV2 在主类中的位置找到了一个修复程序,并在此更改了 JVM 签名。

但是请告诉我如何正确处理它。

java kotlin migration corda
1个回答
0
投票

问题可能始于删除驱动程序字段。从技术上讲,您不应该删除处于合同状态的字段。从旧版本状态中删除字段后,您将无法在分类帐上加载任何现有状态。

您需要将新字段添加为可空字段并保留旧字段。一旦网络上的所有节点都升级了,你就可以停止填充旧字段,但你永远不应该停止拥有和理解旧字段,因为从账本加载的任何旧字段都会填充它,如果它不存在就会抱怨。

至于构造函数不能区分 Set 和 Set,你在修复它的正确路径上。

© www.soinside.com 2019 - 2024. All rights reserved.