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。但是,我们建议尽可能使用支持的类型。
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。但是,我们建议尽可能使用支持的类型。