# Kotlin Serialization Guide Kotlin Serialization is a cross-platform and multi-format framework for data serialization—converting trees of objects to strings, byte arrays, or other _serial_ representations and back. Kotlin Serialization fully supports and enforces the Kotlin type system, making sure only valid objects can be deserialized. Kotlin Serialization is not just a library. It is a compiler plugin that is bundled with the Kotlin compiler distribution itself. Build configuration is explained in [README.md](../README.md#setup). Once the project is set up, we can start serializing some classes. ## Table of contents **Chapter 1.** [Basic Serialization](basic-serialization.md) (**start reading here**) * [Basics](basic-serialization.md#basics) * [JSON encoding](basic-serialization.md#json-encoding) * [JSON decoding](basic-serialization.md#json-decoding) * [Serializable classes](basic-serialization.md#serializable-classes) * [Backing fields are serialized](basic-serialization.md#backing-fields-are-serialized) * [Constructor properties requirement](basic-serialization.md#constructor-properties-requirement) * [Data validation](basic-serialization.md#data-validation) * [Optional properties](basic-serialization.md#optional-properties) * [Optional property initializer call](basic-serialization.md#optional-property-initializer-call) * [Required properties](basic-serialization.md#required-properties) * [Transient properties](basic-serialization.md#transient-properties) * [Defaults are not encoded by default](basic-serialization.md#defaults-are-not-encoded-by-default) * [Nullable properties](basic-serialization.md#nullable-properties) * [Type safety is enforced](basic-serialization.md#type-safety-is-enforced) * [Referenced objects](basic-serialization.md#referenced-objects) * [No compression of repeated references](basic-serialization.md#no-compression-of-repeated-references) * [Generic classes](basic-serialization.md#generic-classes) * [Serial field names](basic-serialization.md#serial-field-names) **Chapter 2.** [Builtin Classes](builtin-classes.md) * [Primitives](builtin-classes.md#primitives) * [Numbers](builtin-classes.md#numbers) * [Long numbers](builtin-classes.md#long-numbers) * [Long numbers as strings](builtin-classes.md#long-numbers-as-strings) * [Enum classes](builtin-classes.md#enum-classes) * [Serial names of enum entries](builtin-classes.md#serial-names-of-enum-entries) * [Composites](builtin-classes.md#composites) * [Pair and triple](builtin-classes.md#pair-and-triple) * [Lists](builtin-classes.md#lists) * [Sets and other collections](builtin-classes.md#sets-and-other-collections) * [Deserializing collections](builtin-classes.md#deserializing-collections) * [Maps](builtin-classes.md#maps) * [Unit and singleton objects](builtin-classes.md#unit-and-singleton-objects) * [Duration](builtin-classes.md#duration) * [Nothing](builtin-classes.md#nothing) **Chapter 3.** [Serializers](serializers.md) * [Introduction to serializers](serializers.md#introduction-to-serializers) * [Plugin-generated serializer](serializers.md#plugin-generated-serializer) * [Plugin-generated generic serializer](serializers.md#plugin-generated-generic-serializer) * [Builtin primitive serializers](serializers.md#builtin-primitive-serializers) * [Constructing collection serializers](serializers.md#constructing-collection-serializers) * [Using top-level serializer function](serializers.md#using-top-level-serializer-function) * [Custom serializers](serializers.md#custom-serializers) * [Primitive serializer](serializers.md#primitive-serializer) * [Delegating serializers](serializers.md#delegating-serializers) * [Composite serializer via surrogate](serializers.md#composite-serializer-via-surrogate) * [Hand-written composite serializer](serializers.md#hand-written-composite-serializer) * [Sequential decoding protocol (experimental)](serializers.md#sequential-decoding-protocol-experimental) * [Serializing 3rd party classes](serializers.md#serializing-3rd-party-classes) * [Passing a serializer manually](serializers.md#passing-a-serializer-manually) * [Specifying serializer on a property](serializers.md#specifying-serializer-on-a-property) * [Specifying serializer for a particular type](serializers.md#specifying-serializer-for-a-particular-type) * [Specifying serializers for a file](serializers.md#specifying-serializers-for-a-file) * [Specifying serializer globally using typealias](serializers.md#specifying-serializer-globally-using-typealias) * [Custom serializers for a generic type](serializers.md#custom-serializers-for-a-generic-type) * [Format-specific serializers](serializers.md#format-specific-serializers) * [Contextual serialization](serializers.md#contextual-serialization) * [Serializers module](serializers.md#serializers-module) * [Contextual serialization and generic classes](serializers.md#contextual-serialization-and-generic-classes) * [Deriving external serializer for another Kotlin class (experimental)](serializers.md#deriving-external-serializer-for-another-kotlin-class-experimental) * [External serialization uses properties](serializers.md#external-serialization-uses-properties) **Chapter 4.** [Polymorphism](polymorphism.md) * [Closed polymorphism](polymorphism.md#closed-polymorphism) * [Static types](polymorphism.md#static-types) * [Designing serializable hierarchy](polymorphism.md#designing-serializable-hierarchy) * [Sealed classes](polymorphism.md#sealed-classes) * [Custom subclass serial name](polymorphism.md#custom-subclass-serial-name) * [Concrete properties in a base class](polymorphism.md#concrete-properties-in-a-base-class) * [Objects](polymorphism.md#objects) * [Open polymorphism](polymorphism.md#open-polymorphism) * [Registered subclasses](polymorphism.md#registered-subclasses) * [Serializing interfaces](polymorphism.md#serializing-interfaces) * [Property of an interface type](polymorphism.md#property-of-an-interface-type) * [Static parent type lookup for polymorphism](polymorphism.md#static-parent-type-lookup-for-polymorphism) * [Explicitly marking polymorphic class properties](polymorphism.md#explicitly-marking-polymorphic-class-properties) * [Registering multiple superclasses](polymorphism.md#registering-multiple-superclasses) * [Polymorphism and generic classes](polymorphism.md#polymorphism-and-generic-classes) * [Merging library serializers modules](polymorphism.md#merging-library-serializers-modules) * [Default polymorphic type handler for deserialization](polymorphism.md#default-polymorphic-type-handler-for-deserialization) * [Default polymorphic type handler for serialization](polymorphism.md#default-polymorphic-type-handler-for-serialization) **Chapter 5.** [JSON Features](json.md) * [Json configuration](json.md#json-configuration) * [Pretty printing](json.md#pretty-printing) * [Lenient parsing](json.md#lenient-parsing) * [Ignoring unknown keys](json.md#ignoring-unknown-keys) * [Alternative Json names](json.md#alternative-json-names) * [Coercing input values](json.md#coercing-input-values) * [Encoding defaults](json.md#encoding-defaults) * [Explicit nulls](json.md#explicit-nulls) * [Allowing structured map keys](json.md#allowing-structured-map-keys) * [Allowing special floating-point values](json.md#allowing-special-floating-point-values) * [Class discriminator for polymorphism](json.md#class-discriminator-for-polymorphism) * [Class discriminator output mode](json.md#class-discriminator-output-mode) * [Decoding enums in a case-insensitive manner](json.md#decoding-enums-in-a-case-insensitive-manner) * [Global naming strategy](json.md#global-naming-strategy) * [Json elements](json.md#json-elements) * [Parsing to Json element](json.md#parsing-to-json-element) * [Types of Json elements](json.md#types-of-json-elements) * [Json element builders](json.md#json-element-builders) * [Decoding Json elements](json.md#decoding-json-elements) * [Encoding literal Json content (experimental)](json.md#encoding-literal-json-content-experimental) * [Serializing large decimal numbers](json.md#serializing-large-decimal-numbers) * [Using `JsonUnquotedLiteral` to create a literal unquoted value of `null` is forbidden](json.md#using-jsonunquotedliteral-to-create-a-literal-unquoted-value-of-null-is-forbidden) * [Json transformations](json.md#json-transformations) * [Array wrapping](json.md#array-wrapping) * [Array unwrapping](json.md#array-unwrapping) * [Manipulating default values](json.md#manipulating-default-values) * [Content-based polymorphic deserialization](json.md#content-based-polymorphic-deserialization) * [Under the hood (experimental)](json.md#under-the-hood-experimental) * [Maintaining custom JSON attributes](json.md#maintaining-custom-json-attributes) **Chapter 6.** [Alternative and custom formats (experimental)](formats.md) * [CBOR (experimental)](formats.md#cbor-experimental) * [Ignoring unknown keys](formats.md#ignoring-unknown-keys) * [Byte arrays and CBOR data types](formats.md#byte-arrays-and-cbor-data-types) * [ProtoBuf (experimental)](formats.md#protobuf-experimental) * [Field numbers](formats.md#field-numbers) * [Integer types](formats.md#integer-types) * [Lists as repeated fields](formats.md#lists-as-repeated-fields) * [Packed fields](formats.md#packed-fields) * [ProtoBuf schema generator (experimental)](formats.md#protobuf-schema-generator-experimental) * [Properties (experimental)](formats.md#properties-experimental) * [Custom formats (experimental)](formats.md#custom-formats-experimental) * [Basic encoder](formats.md#basic-encoder) * [Basic decoder](formats.md#basic-decoder) * [Sequential decoding](formats.md#sequential-decoding) * [Adding collection support](formats.md#adding-collection-support) * [Adding null support](formats.md#adding-null-support) * [Efficient binary format](formats.md#efficient-binary-format) * [Format-specific types](formats.md#format-specific-types) **Appendix A.** [Serialization and value classes (IR-only)](value-classes.md) * [Serializable value classes](value-classes.md#serializable-value-classes) * [Unsigned types support (JSON only)](value-classes.md#unsigned-types-support-json-only) * [Using value classes in your custom serializers](value-classes.md#using-value-classes-in-your-custom-serializers)