Класс состояния 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
Так в чем может быть причина?
Timestamp не указан как поддерживаемый тип: docs.corda.net/serialization.html#jdk-types. Используйте java.time.InstantСпасибо, Андреас.




Как указал Андреас, если класс Java имеет несколько конструкторов, среда сериализации Corda требует, чтобы он указывал, какой конструктор использовать с помощью аннотации @ConstructorForDeserialization.
java.sql.Timestamp этого не делает. Чтобы использовать его в качестве поля в состоянии, вам необходимо предоставить настраиваемый сериализатор: https://docs.corda.net/cordapp-custom-serializers.html. Однако мы рекомендуем по возможности использовать поддерживаемые типы.
Да, я писал настраиваемый подключаемый сериализатор для Timestamp, но снова у меня возник тот же вопрос: рекомендуется ли это для этого основного типа Java. Спасибо, Джоэл.
Вы можете занести в белый список
Timestampвсе, что захотите, но это еще не значит, что у него есть действующий конструктор, который Corda знает, как использовать.