首页 > 解决方案 > java.io.NotSerializableException:-> 没有为类 java.sql.Timestamp 找到反序列化的构造函数

问题描述

具有类型成员变量的Collateral状态类java.sql.Timestamp在版本中的反序列化时引发以下异常3.1-corda

java.io.NotSerializableException: net.corda.core.contracts.TransactionState -> data(net.corda.core.contracts.ContractState) -> No constructor for deserialization found for class java.sql.Timestamp. -> class java.sql.Timestamp -> class com.syne.cordapp.state.Collateral

该类java.sql.Timestamp已经是白名单的一部分,实现为:

class CordaSerializationWhitelist : SerializationWhitelist {
    override val whitelist: List<Class<*>>
        get() = listOf(Timestamp::class.java, HashSet::class.java, Set::class.java)
}

并且这个类也添加到文件中 -META-INF/services/net.corda.core.serialization.SerializationWhitelist

那么可能是什么原因呢?

标签: javacorda

解决方案


正如 Andreas 所指出的,如果一个 Java 类有多个构造函数,那么 Corda 序列化框架要求它使用@ConstructorForDeserialization注解来指定使用哪个构造函数。

java.sql.Timestamp不这样做。要将其用作状态中的字段,您必须提供自定义序列化程序:https ://docs.corda.net/cordapp-custom-serializers.html 。但是,我们建议尽可能使用支持的类型。


推荐阅读