# 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)