Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Corda java.io.NotSerializableException:构造函数参数arg0不';I don’不要引用类别的属性_Corda - Fatal编程技术网

Corda java.io.NotSerializableException:构造函数参数arg0不';I don’不要引用类别的属性

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”的

在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:?]


如何修复此问题?

默认情况下,编译的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"
}