#serialization #blockchain #corda
#сериализация #блокчейн #corda
Вопрос:
Я пытался сериализовать класс (DTO), который будет использоваться при отправке и получении в потоках.Мой класс DTO не находится в том же модуле, что и flows. Я получаю следующие ошибки
1. С аннотацией @CordaSerializable мой класс DTO не сериализуется и выдает
java.io.NotSerializableException: Class "class com.e_mobility.dto.dashboard.DashboardDTO" is not on the whitelist or annotated with @CordaSerializable
-
С ручным внесением в белый список, как показано ниже
класс CustomSerializationWhiteList: SerializationWhitelist { переопределить значение белого списка: Список<Class<*>> = listOf(DTO::class.java ) }
Я получаю эту ошибку во время выполнения
net.corda.core.serialization.internal.MissingSerializerException: Unable to create an object serializer for type class com.e_mobility.dto.dashboard.DashboardDTO:
Mandatory constructor parameters [arg0, arg1, arg2, arg3, arg4, arg5, arg6] are missing from the readable properties []
Either provide getters or readable fields for [arg0, arg1, arg2, arg3, arg4, arg5, arg6], or provide a custom serializer for this type
Пожалуйста, помогите мне устранить эту ошибку. (отредактировано)
Ответ №1:
При создании пользовательского типа вы проверили, выполнены ли в вашем классе все необходимые требования? Одной аннотации может быть недостаточно. Из соответствующей документации Corda о сериализации с пользовательскими типами:
- Класс должен быть скомпилирован с именами параметров, включенными в файл .class. Это значение по умолчанию в Kotlin, но его необходимо включить в Java с помощью параметра командной строки -parameters в javac
- Класс должен быть аннотирован с помощью @CordaSerializable
- Должны поддерживаться объявленные типы аргументов конструктора, средства получения и установки, а там, где используются общие параметры, общим параметром должен быть поддерживаемый тип, открытый подстановочный знак (*) или ограниченный подстановочный знак, который в настоящее время расширен до открытого подстановочного знака
- Любой суперкласс должен соответствовать тем же правилам, но может быть абстрактным
- Циклы объектного графа не поддерживаются, поэтому объект не может ссылаться на себя прямо или косвенно