java.io.NotSerializableException:构造函数参数arg0不引用类的属性

Joe*_*oel 3 corda

在IntelliJ中运行Corda合同测试时,用Java编写的测试有时会失败,并出现以下异常:

[错误] 17:02:51,821 [main](Schema.kt:437)amqp.Schema.fingerprintForType - 构造函数参数arg0不引用类'class mypackage.MyState'的属性 - > class mypackage.MyState {} java.io.NotSerializableException:构造函数参数arg0在net.corda.nodeapi.internal.serialization.amqp.SerializationHelperKt.propertiesForSerializationFromConstructor(SerializationHelper.kt:249)中没有引用类'class mypackage.MyState'的属性〜[corda -node-API的琴弦-3.0.jar:?]

我怎样才能解决这个问题?

小智 6

正如Joel所解释的,默认情况下,编译的Java类将使用默认名称作为其构造函数参数.在Corda的情况下,我们应该为参数名称使用相同的名称,不是因为更好地识别每个参数名称或者它们是如此美丽以保持相同的名称,但是因为在AMQP通过AMQP实现的序列化和反序列化期间进行了验证一个专门为Corda(corda-node-api)定制和重写的组件.此组件检查Transaction(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>
Run Code Online (Sandbox Code Playgroud)

有关Pass Compiler Arguments Maven的更多信息, 请访问https://maven.apache.org/plugins/maven-compiler-plugin/examples/pass-compiler-arguments.html

build.gradle - Gradle

tasks.withType(JavaCompile) {
    options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" << "-Xlint:-options" << "-parameters"
}
Run Code Online (Sandbox Code Playgroud)

有关CompileOptions Gradle的更多信息, 请访问https://docs.gradle.org/current/dsl/org.gradle.api.tasks.compile.CompileOptions.html

你可以看到一个StackOverflow帖子质疑如何在这里设置compileOptions 如何设置我的Gradle Java插件的compileOptions?