Сериализация Sealed класса в классе данных с использованием Gson в kotlin - PullRequest
1 голос
/ 17 февраля 2020

Я создал запечатанный класс для поля json Value в CustomAttribute классе данных. Это поле может возвращать String или Array of Strings.

Как мы можем десериализовать этот запечатанный класс из json?

data class CustomAttribute (
     val attributeCode: String,
     val value: Value 
)

sealed class Value {
      class StringArrayValue(val value: List<String>) : Value()
      class StringValue(val value: String)            : Value()
}

1 Ответ

0 голосов
/ 18 февраля 2020

В прошлом я успешно сериализовал и десериализовал запечатанный класс с отказом от использования Джексона, а не Гсона в качестве механизма сериализации.

Мой запечатанный класс был определен как:

@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, include = JsonTypeInfo.As.PROPERTY, visible = true)
sealed class FlexibleResponseModel
    class SnapshotResponse(val collection: List<EntityModel>): FlexibleResponseModel()
    class DifferentialResponse(val collection: List<EntityModel>): FlexibleResponseModel()
    class EventDrivenResponse(val collection: List<EntityEventModel>): FlexibleResponseModel()
    class ErrorResponse(val error: String): FlexibleResponseModel()

С использованными аннотациями не требовалось дополнительной настройки для экземпляра Jackson для правильной сериализации и десериализации экземпляров этого запечатанного класса. что обе стороны сообщения обладали единообразным определением запечатанного класса.

Хотя я признаю, что JsonTypeInfo является аннотацией c, определяемой Джексоном, возможно, вы могли бы подумать о переключении с Gson, если эта функция необходима, или вы можете найти эквивалентную конфигурацию для Gson который также включал бы идентификатор класса в ваши сериализованные данные.

...