java.io.NotSerializableException: -> 未找到 class java.sql.Timestamp 的反序列化构造函数

java.io.NotSerializableException: -> No constructor for deserialization found for class java.sql.Timestamp

Collateral 状态 class 类型 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 已经是白名单的一部分,实现为:

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

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

那么可能是什么原因呢?

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

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