kotlinx-serialization / kotlinx.serialization.modules / SerializersModuleBuilder / polymorphic

polymorphic

(common, js, jvm, native) fun <Base : Any, Sub : Base> polymorphic(baseClass: KClass<Base>, actualClass: KClass<Sub>, actualSerializer: KSerializer<Sub>): Unit

Adds serializer associated with given actualClass in the scope of baseClass for polymorphic serialization. Throws SerializationException if a module already has serializer associated with a actualClass. To overwrite an already registered serializer, SerialModule.overwriteWith can be used.

(common, js, jvm, native) fun <Base : Any> polymorphic(baseClass: KClass<Base>, baseSerializer: KSerializer<Base>? = null, buildAction: PolymorphicModuleBuilder<Base>.() -> Unit = {}): Unit

Creates a builder to register all subclasses of a given baseClass for polymorphic serialization. If baseSerializer is not null, registers it as a serializer for baseClass (which is useful if base class is serializable). To add subclasses, use PolymorphicModuleBuilder.subclass or PolymorphicModuleBuilder.with.

If serializer already registered for the given KClass in the given scope, a SerializerAlreadyRegisteredException is thrown. To override registered serializers, combine built module with another using SerialModule.overwriteWith.

See Also

PolymorphicSerializer

(common, js, jvm, native) inline fun <reified Base : Any> polymorphic(baseSerializer: KSerializer<Base>? = null, noinline buildAction: PolymorphicModuleBuilder<Base>.() -> Unit = {}): Unit(common, js, jvm, native) fun polymorphic(baseClass: KClass<*>, vararg baseClasses: KClass<*>, buildAction: PolymorphicModuleBuilder<Any>.() -> Unit = {}): Unit

Creates a builder to register all serializable subclasses for polymorphic serialization for multiple base classes. This is useful when you have more two or more super classes in a large hierarchy, e.g.:

interface I
@Serializable abstract class A() : I
@Serializable final class B : A()
@Serializable class Message(@Polymorphic val i: I, @Polymorphic val a: A)

In this case, you have to register B as subclass for two base classes: I and A.

Note that serializer (if present) for each of the baseClasses should be registered separately inside buildAction to avoid duplicates, e.g.:

polymorphic(Any::class, PolyBase::class) {
  PolyBase::class with PolyBase.serializer()
  subclass<PolyDerived>() // Shorthand with default serializer
}

If serializer already registered for the given KClass in the given scope, a SerializerAlreadyRegisteredException is thrown. To override registered serializers, combine built module with another using SerialModule.overwriteWith.

See Also

PolymorphicSerializer