Corda java.io.NotSerializableException:构造函数参数arg0不';I don’不要引用类别的属性
在IntelliJ中运行Corda contract测试时,用Java编写的测试有时会失败,出现以下异常: [错误]17:02:51821[main](Schema.kt:437)amqp.Schema.指纹类型-构造函数参数arg0未引用类“class mypackage.MyState”->class mypackage.MyState{}的属性 java.io.NotSerializableException:构造函数参数arg0未引用类“class mypackage.MyState”的属性 在net.corda.nodeapi.internal.serialization.amqp.SerializationHelperKt.propertiesForSerializationFromConstructor(SerializationHelper.kt:249)~[corda-node-api-corda-3.0.jar:?]Corda java.io.NotSerializableException:构造函数参数arg0不';I don’不要引用类别的属性,corda,Corda,在IntelliJ中运行Corda contract测试时,用Java编写的测试有时会失败,出现以下异常: [错误]17:02:51821[main](Schema.kt:437)amqp.Schema.指纹类型-构造函数参数arg0未引用类“class mypackage.MyState”->class mypackage.MyState{}的属性 java.io.NotSerializableException:构造函数参数arg0未引用类“class mypackage.MyState”的
如何修复此问题?默认情况下,编译的Java类将使用默认名称作为其构造函数参数(
arg0
,arg1
,等等)。但是,出于序列化目的,我们需要实际的参数名。您需要让Java使用实际的参数名进行编译
在IntelliJ中:
如果通过IntelliJ运行节点/测试,可以通过将以下块添加到.idea/compiler.xml
文件中来实现:
<component name="JavacSettings">
<option name="ADDITIONAL_OPTIONS_STRING" value="-parameters" />
</component>
您可以看到一个示例。正如Joel所解释的,默认情况下,编译的Java类将使用默认名称作为其构造函数参数。在Corda的情况下,我们应该为参数名使用相同的名称,这不是因为更好地识别它们中的每一个,或者它们保持相同的名称非常漂亮,而是因为在AMQP通过专门定制和重写到Corda(Corda节点api)的组件实现的序列化和反序列化过程中存在验证。此组件检查事务期间涉及的每个属性(ContractState)。提醒您,在Corda中,所有序列化和反序列化都是受控的,如果存在冲突,则可能会失败 要解决这个问题,有不同的形式,这取决于您使用哪个工具来自动化编译—gradle、maven等。这是一个独立于IDE(Eclipse、IntelliJ等)的解决方案 Maven-pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<compilerArgs>
<arg>-verbose</arg>
<arg>-parameters</arg> <!-- To keep parameter names-->
<arg>-Xlint:all,-options,-path</arg>
</compilerArgs>
</configuration>
</plugin>
org.apache.maven.plugins
build.gradle-gradle
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" << "-Xlint:-options" << "-parameters"
}
tasks.withType(JavaCompile){
options.compilerArgs
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" << "-Xlint:-options" << "-parameters"
}