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

Так в чем может быть причина?

Вы можете занести в белый список Timestamp все, что захотите, но это еще не значит, что у него есть действующий конструктор, который Corda знает, как использовать.

Andreas 26.04.2018 08:27
Timestamp не указан как поддерживаемый тип: docs.corda.net/serialization.html#jdk-types. Используйте java.time.Instant
Andreas 26.04.2018 08:33

Спасибо, Андреас.

balajimore 27.04.2018 09:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
472
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как указал Андреас, если класс Java имеет несколько конструкторов, среда сериализации Corda требует, чтобы он указывал, какой конструктор использовать с помощью аннотации @ConstructorForDeserialization.

java.sql.Timestamp этого не делает. Чтобы использовать его в качестве поля в состоянии, вам необходимо предоставить настраиваемый сериализатор: https://docs.corda.net/cordapp-custom-serializers.html. Однако мы рекомендуем по возможности использовать поддерживаемые типы.

Да, я писал настраиваемый подключаемый сериализатор для Timestamp, но снова у меня возник тот же вопрос: рекомендуется ли это для этого основного типа Java. Спасибо, Джоэл.

balajimore 27.04.2018 09:05

Другие вопросы по теме