Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: Kotlin/kotlinx.serialization
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v1.4.1
Choose a base ref
...
head repository: Kotlin/kotlinx.serialization
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v1.5.0
Choose a head ref
Loading
Showing with 4,813 additions and 1,074 deletions.
  1. +3 −0 .gitignore
  2. +97 −1 CHANGELOG.md
  3. +63 −82 README.md
  4. +2 −2 benchmark/build.gradle
  5. +5 −0 benchmark/src/jmh/kotlin/kotlinx/benchmarks/json/JacksonComparisonBenchmark.kt
  6. +21 −4 benchmark/src/jmh/kotlin/kotlinx/benchmarks/json/TwitterFeedBenchmark.kt
  7. +170 −0 benchmark/src/jmh/kotlin/kotlinx/benchmarks/model/MacroTwitterUntailored.kt
  8. +21 −4 build.gradle
  9. +0 −3 buildSrc/build.gradle.kts
  10. +22 −0 buildSrc/src/main/kotlin/Bom.kt
  11. +4 −1 buildSrc/src/main/kotlin/Java9Modularity.kt
  12. +18 −0 core/api/kotlinx-serialization-core.api
  13. +20 −0 core/build.gradle
  14. +4 −1 core/commonMain/src/kotlinx/serialization/Annotations.kt
  15. +1 −3 core/commonMain/src/kotlinx/serialization/KSerializer.kt
  16. +1 −1 core/commonMain/src/kotlinx/serialization/PolymorphicSerializer.kt
  17. +10 −4 core/commonMain/src/kotlinx/serialization/SealedSerializer.kt
  18. +79 −27 core/commonMain/src/kotlinx/serialization/Serializers.kt
  19. +9 −0 core/commonMain/src/kotlinx/serialization/builtins/BuiltinSerializers.kt
  20. +28 −14 core/commonMain/src/kotlinx/serialization/descriptors/SerialDescriptor.kt
  21. +1 −1 core/commonMain/src/kotlinx/serialization/descriptors/SerialDescriptors.kt
  22. +51 −0 core/commonMain/src/kotlinx/serialization/encoding/ChunkedDecoder.kt
  23. +3 −2 core/commonMain/src/kotlinx/serialization/internal/AbstractPolymorphicSerializer.kt
  24. +14 −0 core/commonMain/src/kotlinx/serialization/internal/BuiltInSerializers.kt
  25. +27 −1 core/commonMain/src/kotlinx/serialization/internal/Enums.kt
  26. +2 −1 core/commonMain/src/kotlinx/serialization/internal/InlineClassDescriptor.kt
  27. +33 −0 core/commonMain/src/kotlinx/serialization/internal/NothingSerialDescriptor.kt
  28. +15 −19 core/commonMain/src/kotlinx/serialization/internal/Platform.common.kt
  29. +8 −0 core/commonMain/src/kotlinx/serialization/internal/Primitives.kt
  30. +1 −1 core/commonMain/src/kotlinx/serialization/internal/Tagged.kt
  31. +20 −18 core/commonMain/src/kotlinx/serialization/modules/PolymorphicModuleBuilder.kt
  32. +5 −5 core/commonMain/src/kotlinx/serialization/modules/SerializersModule.kt
  33. +13 −8 core/commonMain/src/kotlinx/serialization/modules/SerializersModuleBuilders.kt
  34. +27 −14 core/commonMain/src/kotlinx/serialization/modules/SerializersModuleCollector.kt
  35. +17 −0 core/commonTest/src/kotlinx/serialization/BasicTypesSerializationTest.kt
  36. +2 −3 core/commonTest/src/kotlinx/serialization/CachedSerializersTest.kt
  37. +105 −0 core/commonTest/src/kotlinx/serialization/EnumDescriptorsTest.kt
  38. +29 −0 core/commonTest/src/kotlinx/serialization/PrimitiveSerialDescriptorTest.kt
  39. +5 −7 core/commonTest/src/kotlinx/serialization/SerializersLookupEnumTest.kt
  40. +8 −10 core/commonTest/src/kotlinx/serialization/SerializersLookupObjectTest.kt
  41. +1 −4 core/jsMain/src/kotlinx/serialization/internal/Platform.kt
  42. +52 −33 core/jvmMain/src/kotlinx/serialization/SerializersJvm.kt
  43. +120 −30 core/jvmMain/src/kotlinx/serialization/internal/Caching.kt
  44. +1 −19 core/jvmMain/src/kotlinx/serialization/internal/Platform.kt
  45. +3 −10 core/nativeMain/src/kotlinx/serialization/internal/Platform.kt
  46. +1 −1 docs/basic-serialization.md
  47. +19 −10 docs/building.md
  48. +29 −0 docs/builtin-classes.md
  49. +162 −8 docs/json.md
  50. +5 −4 docs/polymorphism.md
  51. +4 −0 docs/serialization-guide.md
  52. +1 −1 docs/serializers.md
  53. +8 −0 formats/README.md
  54. +26 −0 formats/hocon/api/kotlinx-serialization-hocon.api
  55. +1 −0 formats/hocon/build.gradle
  56. +58 −13 formats/hocon/src/main/kotlin/kotlinx/serialization/hocon/Hocon.kt
  57. +47 −0 formats/hocon/src/main/kotlin/kotlinx/serialization/hocon/HoconDecoder.kt
  58. +39 −136 formats/hocon/src/main/kotlin/kotlinx/serialization/hocon/HoconEncoder.kt
  59. +147 −0 formats/hocon/src/main/kotlin/kotlinx/serialization/hocon/HoconEncoders.kt
  60. +3 −0 formats/hocon/src/main/kotlin/kotlinx/serialization/hocon/HoconExceptions.kt
  61. +62 −0 formats/hocon/src/main/kotlin/kotlinx/serialization/hocon/internal/HoconDuration.kt
  62. +10 −0 formats/hocon/src/main/kotlin/kotlinx/serialization/hocon/internal/SuppressAnimalSniffer.kt
  63. +70 −0 formats/hocon/src/main/kotlin/kotlinx/serialization/hocon/serializers/ConfigMemorySizeSerializer.kt
  64. +52 −0 formats/hocon/src/main/kotlin/kotlinx/serialization/hocon/serializers/JavaDurationSerializer.kt
  65. +1 −0 formats/hocon/src/mainModule/kotlin/module-info.java
  66. +196 −0 formats/hocon/src/test/kotlin/kotlinx/serialization/hocon/HoconDurationTest.kt
  67. +177 −0 formats/hocon/src/test/kotlin/kotlinx/serialization/hocon/HoconJavaDurationTest.kt
  68. +175 −0 formats/hocon/src/test/kotlin/kotlinx/serialization/hocon/HoconMemorySizeTest.kt
  69. +7 −3 formats/hocon/src/test/kotlin/kotlinx/serialization/hocon/HoconObjectsTest.kt
  70. +0 −1 formats/json-tests/commonTest/src/kotlinx/serialization/EncodingExtensionsTest.kt
  71. +0 −1 formats/json-tests/commonTest/src/kotlinx/serialization/EnumSerializationTest.kt
  72. +0 −1 formats/json-tests/commonTest/src/kotlinx/serialization/NotNullSerializersCompatibilityOnFileTest.kt
  73. +2 −2 ...ats/json-tests/commonTest/src/kotlinx/serialization/SerializableOnPropertyTypeAndTypealiasTest.kt
  74. +0 −2 formats/json-tests/commonTest/src/kotlinx/serialization/SerializationForNullableTypeOnFileTest.kt
  75. +0 −1 formats/json-tests/commonTest/src/kotlinx/serialization/SerializerForNullableTypeTest.kt
  76. +20 −7 formats/json-tests/commonTest/src/kotlinx/serialization/SerializersLookupTest.kt
  77. +2 −2 formats/json-tests/commonTest/src/kotlinx/serialization/features/BinaryPayloadExampleTest.kt
  78. +10 −12 formats/json-tests/commonTest/src/kotlinx/serialization/features/DurationTest.kt
  79. +0 −1 formats/json-tests/commonTest/src/kotlinx/serialization/features/GenericCustomSerializerTest.kt
  80. +60 −0 formats/json-tests/commonTest/src/kotlinx/serialization/features/JsonNamingStrategyExclusionTest.kt
  81. +195 −0 formats/json-tests/commonTest/src/kotlinx/serialization/features/JsonNamingStrategyTest.kt
  82. +1 −2 formats/json-tests/commonTest/src/kotlinx/serialization/features/inline/InlineClassesTest.kt
  83. +43 −43 formats/json-tests/commonTest/src/kotlinx/serialization/features/inline/UnsignedIntegersTest.kt
  84. +12 −3 formats/json-tests/commonTest/src/kotlinx/serialization/features/sealed/SealedDiamondTest.kt
  85. +74 −0 formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonChunkedStringDecoderTest.kt
  86. +14 −1 formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonCoerceInputValuesTest.kt
  87. +0 −1 formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonMapKeysTest.kt
  88. +0 −1 formats/json-tests/commonTest/src/kotlinx/serialization/json/MapLikeSerializerTest.kt
  89. +23 −1 ...s/json-tests/commonTest/src/kotlinx/serialization/json/serializers/JsonPrimitiveSerializerTest.kt
  90. +140 −0 formats/json-tests/commonTest/src/kotlinx/serialization/json/serializers/JsonUnquotedLiteralTest.kt
  91. +43 −0 formats/json-tests/commonTest/src/kotlinx/serialization/test/CompilerVersions.kt
  92. +1 −2 formats/json-tests/jsTest/src/kotlinx/serialization/json/EncodeToDynamicTest.kt
  93. +39 −0 formats/json-tests/jsTest/src/kotlinx/serialization/json/JsonNamingStrategyDynamicTest.kt
  94. BIN formats/json-tests/jvmTest/resources/class_loaders/classes/example/Foo$$serializer.class
  95. BIN formats/json-tests/jvmTest/resources/class_loaders/classes/example/Foo$Companion.class
  96. BIN formats/json-tests/jvmTest/resources/class_loaders/classes/example/Foo.class
  97. +193 −0 formats/json-tests/jvmTest/src/kotlinx/serialization/BigDecimalTest.kt
  98. +0 −1 formats/json-tests/jvmTest/src/kotlinx/serialization/SerializeJavaClassTest.kt
  99. +119 −0 formats/json-tests/jvmTest/src/kotlinx/serialization/SerializerByTypeCacheTest.kt
  100. +3 −4 formats/json-tests/jvmTest/src/kotlinx/serialization/features/SerializerByTypeTest.kt
  101. +85 −0 formats/json-tests/jvmTest/src/kotlinx/serialization/json/JsonChunkedBase64DecoderTest.kt
  102. +78 −0 formats/json-tests/jvmTest/src/kotlinx/serialization/json/JsonConcurrentStressTest.kt
  103. +0 −22 formats/json-tests/jvmTest/src/kotlinx/serialization/json/ParallelJsonStressTest.kt
  104. +13 −0 formats/json/api/kotlinx-serialization-json.api
  105. +18 −1 formats/json/commonMain/src/kotlinx/serialization/json/Json.kt
  106. +6 −2 formats/json/commonMain/src/kotlinx/serialization/json/JsonAnnotations.kt
  107. +6 −3 formats/json/commonMain/src/kotlinx/serialization/json/JsonConfiguration.kt
  108. +1 −1 formats/json/commonMain/src/kotlinx/serialization/json/JsonContentPolymorphicSerializer.kt
  109. +49 −3 formats/json/commonMain/src/kotlinx/serialization/json/JsonElement.kt
  110. +9 −10 formats/json/commonMain/src/kotlinx/serialization/json/JsonElementSerializers.kt
  111. +132 −0 formats/json/commonMain/src/kotlinx/serialization/json/JsonNamingStrategy.kt
  112. +9 −0 formats/json/commonMain/src/kotlinx/serialization/json/internal/CharArrayPool.common.kt
  113. +8 −1 formats/json/commonMain/src/kotlinx/serialization/json/internal/Composers.kt
  114. +1 −1 formats/json/commonMain/src/kotlinx/serialization/json/internal/JsonExceptions.kt
  115. +49 −14 formats/json/commonMain/src/kotlinx/serialization/json/internal/JsonNamesMap.kt
  116. +9 −5 formats/json/commonMain/src/kotlinx/serialization/json/internal/JsonStreams.kt
  117. +1 −1 formats/json/commonMain/src/kotlinx/serialization/json/internal/PolymorphismValidator.kt
  118. +4 −2 formats/json/commonMain/src/kotlinx/serialization/json/internal/SchemaCache.kt
  119. +8 −4 formats/json/commonMain/src/kotlinx/serialization/json/internal/StreamingJsonDecoder.kt
  120. +12 −8 formats/json/commonMain/src/kotlinx/serialization/json/internal/StreamingJsonEncoder.kt
  121. +31 −19 formats/json/commonMain/src/kotlinx/serialization/json/internal/TreeJsonDecoder.kt
  122. +17 −3 formats/json/commonMain/src/kotlinx/serialization/json/internal/TreeJsonEncoder.kt
  123. +63 −9 formats/json/commonMain/src/kotlinx/serialization/json/internal/lexer/AbstractJsonLexer.kt
  124. +7 −3 formats/json/commonMain/src/kotlinx/serialization/json/internal/lexer/JsonLexer.kt
  125. +4 −0 formats/json/commonMain/src/kotlinx/serialization/json/internal/lexer/StringJsonLexer.kt
  126. +12 −0 formats/json/jsMain/src/kotlinx/serialization/json/internal/CharArrayPool.kt
  127. +22 −13 formats/json/jsMain/src/kotlinx/serialization/json/internal/DynamicDecoders.kt
  128. +1 −1 formats/json/jsMain/src/kotlinx/serialization/json/internal/DynamicEncoders.kt
  129. +6 −1 formats/json/jvmMain/src/kotlinx/serialization/json/JvmStreams.kt
  130. +89 −0 formats/json/jvmMain/src/kotlinx/serialization/json/internal/ArrayPools.kt
  131. +0 −30 formats/json/jvmMain/src/kotlinx/serialization/json/internal/ByteArrayPool.kt
  132. +0 −32 formats/json/jvmMain/src/kotlinx/serialization/json/internal/CharArrayPool.kt
  133. +124 −0 formats/json/jvmMain/src/kotlinx/serialization/json/internal/CharsetReader.kt
  134. +17 −9 formats/json/jvmMain/src/kotlinx/serialization/json/internal/JvmJsonStreams.kt
  135. +9 −0 formats/json/nativeMain/src/kotlinx/serialization/json/internal/CharArrayPool.kt
  136. +1 −1 formats/properties/commonMain/src/kotlinx/serialization/properties/Properties.kt
  137. +0 −1 formats/protobuf/jvmTest/src/kotlinx/serialization/protobuf/PolymorphicWithJvmClassTest.kt
  138. +7 −6 gradle.properties
  139. +7 −1 gradle/configure-source-sets.gradle
  140. +1 −1 gradle/kover.gradle
  141. +4 −0 guide/build.gradle
  142. +15 −0 guide/example/example-builtin-13.kt
  143. +13 −22 guide/example/example-json-16.kt
  144. +14 −17 guide/example/example-json-17.kt
  145. +14 −13 guide/example/example-json-18.kt
  146. +2 −28 guide/example/example-json-19.kt
  147. +19 −46 guide/example/example-json-20.kt
  148. +15 −22 guide/example/example-json-21.kt
  149. +22 −0 guide/example/example-json-22.kt
  150. +36 −0 guide/example/example-json-23.kt
  151. +59 −0 guide/example/example-json-24.kt
  152. +37 −0 guide/example/example-json-25.kt
  153. +1 −1 guide/test/BasicSerializationTest.kt
  154. +7 −0 guide/test/BuiltinClassesTest.kt
  155. +44 −9 guide/test/JsonTest.kt
  156. +5 −4 guide/test/PolymorphismTest.kt
  157. +1 −1 guide/test/SerializersTest.kt
  158. +6 −3 integration-test/gradle.properties
  159. +55 −56 integration-test/src/commonTest/kotlin/sample/MultiFileHierarchyModuleB.kt
  160. +45 −45 integration-test/src/commonTest/kotlin/sample/MultiFileHierarchyTest.kt
  161. +1 −1 integration-test/src/jsTest/kotlin/sample/SampleTestsJS.kt
  162. +35 −0 rules/common.pro
  163. +12 −0 rules/r8.pro
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -15,3 +15,6 @@ target

# Modules for JS projects build
node_modules

# benchmarks.jar
/benchmarks.jar
98 changes: 97 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,103 @@
1.5.0 / 2023-02-27
==================

This release contains all features and bugfixes from 1.5.0-RC plus some experimental features and bugfixes on its own (see below).
Kotlin 1.8.10 is used as a default.

### HoconEncoder and HoconDecoder interfaces and HOCON-specific serializers

These interfaces work in a way similar to `JsonEncoder` and `JsonDecoder`: they allow intercepting (de)serialization process,
making writing if custom HOCON-specific serializers easier. New `ConfigMemorySizeSerializer` and `JavaDurationSerializer` already make use of them.
See more details in the [PR](https://github.com/Kotlin/kotlinx.serialization/pull/2094).
Big thanks to [Alexander Mikhailov](https://github.com/alexmihailov) for contributing this!

### Ability to read buffered huge strings in custom Json deserializers

New interface `ChunkedDecoder` allows you to read huge strings that may not fit in memory by chunks.
Currently, this interface is only implemented by Json decoder that works with strings and streams,
but we may expand it later, if there's a demand for it.
See more details in the [PR](https://github.com/Kotlin/kotlinx.serialization/pull/2012) authored by [Alexey Sviridov](https://github.com/fred01).

### Bugfixes

* Improve runtime exceptions messages (#2180)
* Added support for null values for nullable enums in lenient mode (#2176)
* Prevent class loaders from leaking when using ClassValue cache (#2175)

1.5.0-RC / 2023-01-25
==================

This is a release candidate for the next version with many new features to try.
It uses Kotlin 1.8.0 by default.

### Json naming strategies

A long-awaited feature (#33) is available in this release.
A new interface, `JsonNamingStrategy` and Json configuration property `namingStrategy` allow
defining a transformation that is applied to all properties' names serialized by a Json instance.
There's also a predefined implementation for the most common use case: `Json { namingStrategy = JsonNamingStrategy.SnakeCase }`.
Check out the [PR](https://github.com/Kotlin/kotlinx.serialization/pull/2111) for more details and documentation.

### Json unquoted literals

kotlinx-serialization-json has an API for manipulating raw Json values: functions and classes `JsonObject`, `JsonPrimitive`, etc.
In this release, there is a new addition to this API: `JsonUnquotedLiteral` constructor function.
It allows to produce a string that is not quoted in the Json output. This function has a lot of valuable
applications: from writing unsigned or large numbers to embedding whole Json documents without the need for re-parsing.
For an example, read the [Encoding literal Json content docs](https://github.com/Kotlin/kotlinx.serialization/blob/v1.5.0-RC/docs/json.md#encoding-literal-json-content-experimental).
This huge feature was contributed to us by [aSemy](https://github.com/aSemy): [#2041](https://github.com/Kotlin/kotlinx.serialization/pull/2041).

### Stabilization of serializer(java.lang.Type) function family

Functions `serializer`, `serializerOrNull` and extensions `SerializersModule.serializer`, `SerializersModule.serializerOrNull`
have JVM-only overloads that accept `java.lang.Type`. These overloads are crucial for interoperability: with them, third-party Java frameworks
like Spring, which usually rely on Java's reflection and type tokens, can retrieve `KSerializer` instance and use kotlinx.serialization properly.
We've removed `@ExperimentalSerializationApi` from these functions, and starting from 1.5.0-RC they're considered stable with all backward compatibility guarantees.
This change should improve third-party support for kotlinx.serialization in various frameworks.
See the [PR](https://github.com/Kotlin/kotlinx.serialization/issues/2069) for details.

### Deprecations in module builders for polymorphism

Some time ago, in 1.3.2, new functions `SerializersModuleBuilder.polymorphicDefaultSerializer/polymorphicDefaultDeserializer` and `PolymorphicModuleBuilder.defaultDeserializer` were introduced
— better names allow an easier understanding of which serializers affect what part of the process.
In 1.5.0-RC, we finish the migration path: these functions are no longer experimental.
And old functions, namely `SerializersModuleCollector.polymorphicDefault` and `PolymorphicModuleBuilder.default`, are now deprecated.
See the [PR](https://github.com/Kotlin/kotlinx.serialization/issues/2076) for details.

### Bundled Proguard rules

The `kotlinx-serialization-core-jvm` JAR file now includes consumer Proguard rules,
so manual Proguard configuration is no longer necessary for most of the setups.
See updated [Android setup section](https://github.com/Kotlin/kotlinx.serialization/blob/169a14558ca13cfd731283a854d825d1f19ef195/README.md#android)
and corresponding PRs: [#2092](https://github.com/Kotlin/kotlinx.serialization/issues/2092), [#2123](https://github.com/Kotlin/kotlinx.serialization/issues/2123).

### Support for kotlin.Duration in HOCON format

HOCON specifies its own formatting for duration values. Starting with this release,
kotlinx-serialization-hocon is able to serialize and deserialize `kotlin.Duration`
using proper representation instead of the default one. Big thanks to [Alexander Mikhailov](https://github.com/alexmihailov)
and his PRs: [#2080](https://github.com/Kotlin/kotlinx.serialization/issues/2080), [#2073](https://github.com/Kotlin/kotlinx.serialization/issues/2073).

### Functional and performance improvements

* Make DeserializationStrategy covariant at declaration-site (#1897) (thanks to [Lukellmann](https://github.com/Lukellmann))
* Added support for the `kotlin.Nothing` class as built-in (#1991, #2150)
* Further improve stream decoding performance (#2101)
* Introduce CharArray pooling for InputStream decoding (#2100)
* Consolidate exception messages and improve them (#2068)

### Bugfixes

* Add stable hashCode()/equals() calculation to PrimitiveSerialDescriptor (#2136) (thanks to [Vasily Vasilkov](https://github.com/vgv))
* Added a factory that creates an enum serializer with annotations on the class (#2125)
* Correctly handle situation where different serializers can be provided for the same KClass in SealedClassSerializer (#2113)
* Fixed serializers caching for parametrized types from different class loaders (#2070)


1.4.1 / 2022-10-14
==================

This is patch release contains several bugfixes and improvements.
This is patch release contains several bugfixes and improvements.
Kotlin 1.7.20 is used by default.

### Improvements
145 changes: 63 additions & 82 deletions README.md
Original file line number Diff line number Diff line change
@@ -4,8 +4,8 @@
[![JetBrains official project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)
[![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0)
[![TeamCity build](https://img.shields.io/teamcity/http/teamcity.jetbrains.com/s/KotlinTools_KotlinxSerialization_Ko.svg)](https://teamcity.jetbrains.com/viewType.html?buildTypeId=KotlinTools_KotlinxSerialization_Ko&guest=1)
[![Kotlin](https://img.shields.io/badge/kotlin-1.7.20-blue.svg?logo=kotlin)](http://kotlinlang.org)
[![Maven Central](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-serialization-core/1.4.1)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-serialization-core/1.4.1/pom)
[![Kotlin](https://img.shields.io/badge/kotlin-1.8.10-blue.svg?logo=kotlin)](http://kotlinlang.org)
[![Maven Central](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-serialization-core/1.5.0)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-serialization-core/1.5.0/pom)
[![KDoc link](https://img.shields.io/badge/API_reference-KDoc-blue)](https://kotlinlang.org/api/kotlinx.serialization/)
[![Slack channel](https://img.shields.io/badge/chat-slack-blue.svg?logo=slack)](https://kotlinlang.slack.com/messages/serialization/)

@@ -29,12 +29,15 @@ Kotlin serialization consists of a compiler plugin, that generates visitor code
* [Android](#android)
* [Multiplatform (Common, JS, Native)](#multiplatform-common-js-native)
* [Maven](#maven)
* [Bazel](#bazel)

<!--- END -->

* **Additional links**
* [Kotlin Serialization Guide](docs/serialization-guide.md)
* [Full API reference](https://kotlinlang.org/api/kotlinx.serialization/)
* [Submitting issues and PRs](CONTRIBUTING.md)
* [Building this library](docs/building.md)

## Introduction and references

@@ -89,17 +92,17 @@ Kotlin DSL:

```kotlin
plugins {
kotlin("jvm") version "1.7.20" // or kotlin("multiplatform") or any other kotlin plugin
kotlin("plugin.serialization") version "1.7.20"
kotlin("jvm") version "1.8.10" // or kotlin("multiplatform") or any other kotlin plugin
kotlin("plugin.serialization") version "1.8.10"
}
```

Groovy DSL:

```gradle
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '1.7.20'
id 'org.jetbrains.kotlin.plugin.serialization' version '1.7.20'
id 'org.jetbrains.kotlin.multiplatform' version '1.8.10'
id 'org.jetbrains.kotlin.plugin.serialization' version '1.8.10'
}
```

@@ -116,7 +119,7 @@ buildscript {
repositories { mavenCentral() }

dependencies {
val kotlinVersion = "1.7.20"
val kotlinVersion = "1.8.10"
classpath(kotlin("gradle-plugin", version = kotlinVersion))
classpath(kotlin("serialization", version = kotlinVersion))
}
@@ -127,7 +130,7 @@ Groovy DSL:

```gradle
buildscript {
ext.kotlin_version = '1.7.20'
ext.kotlin_version = '1.8.10'
repositories { mavenCentral() }
dependencies {
@@ -156,7 +159,7 @@ repositories {
}

dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0")
}
```

@@ -168,104 +171,76 @@ repositories {
}
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0"
}
```

>We also provide `kotlinx-serialization-core` artifact that contains all serialization API but does not have bundled serialization format with it
### Android

The library works on Android, but, if you're using ProGuard,
you need to add rules to your `proguard-rules.pro` configuration to cover all classes that are serialized at runtime.
By default, proguard rules are supplied with the library.
[These rules](rules/common.pro) keep serializers for _all_ serializable classes that are retained after shrinking,
so you don't need additional setup.

The following configuration keeps serializers for _all_ serializable classes that are retained after shrinking.
Uncomment and modify the last section in case you're serializing classes with named companion objects.
**However, these rules do not affect serializable classes if they have named companion objects.**

If you want to serialize classes with named companion objects, you need to add and edit rules below to your `proguard-rules.pro` configuration.

Note that the rules for R8 differ depending on the [compatibility mode](https://r8.googlesource.com/r8/+/refs/heads/master/compatibility-faq.md) used.

<details>
<summary>Example of named companion rules for ProGuard and R8 compatibility mode</summary>

```proguard
# Keep `Companion` object fields of serializable classes.
# This avoids serializer lookup through `getDeclaredClasses` as done for named companion objects.
-if @kotlinx.serialization.Serializable class **
-keepclassmembers class <1> {
static <1>$Companion Companion;
}
# Serializer for classes with named companion objects are retrieved using `getDeclaredClasses`.
# If you have any, replace classes with those containing named companion objects.
-keepattributes InnerClasses # Needed for `getDeclaredClasses`.
# Keep `serializer()` on companion objects (both default and named) of serializable classes.
-if @kotlinx.serialization.Serializable class ** {
-if @kotlinx.serialization.Serializable class
com.example.myapplication.HasNamedCompanion, # <-- List serializable classes with named companions.
com.example.myapplication.HasNamedCompanion2
{
static **$* *;
}
-keepclassmembers class <2>$<3> {
kotlinx.serialization.KSerializer serializer(...);
-keepnames class <1>$$serializer { # -keepnames suffices; class is kept when serializer() is kept.
static <1>$$serializer INSTANCE;
}
# Keep `INSTANCE.serializer()` of serializable objects.
-if @kotlinx.serialization.Serializable class ** {
public static ** INSTANCE;
}
-keepclassmembers class <1> {
public static <1> INSTANCE;
kotlinx.serialization.KSerializer serializer(...);
}
# @Serializable and @Polymorphic are used at runtime for polymorphic serialization.
-keepattributes RuntimeVisibleAnnotations,AnnotationDefault
# Serializer for classes with named companion objects are retrieved using `getDeclaredClasses`.
# If you have any, uncomment and replace classes with those containing named companion objects.
#-keepattributes InnerClasses # Needed for `getDeclaredClasses`.
#-if @kotlinx.serialization.Serializable class
#com.example.myapplication.HasNamedCompanion, # <-- List serializable classes with named companions.
#com.example.myapplication.HasNamedCompanion2
#{
# static **$* *;
#}
#-keepnames class <1>$$serializer { # -keepnames suffices; class is kept when serializer() is kept.
# static <1>$$serializer INSTANCE;
#}
```
</details>

In case you want to exclude serializable classes that are used, but never serialized at runtime,
you will need to write custom rules with narrower [class specifications](https://www.guardsquare.com/manual/configuration/usage).

<details>
<summary>Example of custom rules</summary>

```proguard
-keepattributes RuntimeVisibleAnnotations,AnnotationDefault
# kotlinx-serialization-json specific. Add this if you have java.lang.NoClassDefFoundError kotlinx.serialization.json.JsonObjectSerializer
-keepclassmembers class kotlinx.serialization.json.** {
*** Companion;
}
-keepclasseswithmembers class kotlinx.serialization.json.** {
kotlinx.serialization.KSerializer serializer(...);
}
<summary>Example of named companion rules for R8 full mode</summary>

# Application rules
```proguard
# Serializer for classes with named companion objects are retrieved using `getDeclaredClasses`.
# If you have any, replace classes with those containing named companion objects.
-keepattributes InnerClasses # Needed for `getDeclaredClasses`.
# Change here com.yourcompany.yourpackage
-keepclassmembers @kotlinx.serialization.Serializable class com.yourcompany.yourpackage.** {
# lookup for plugin generated serializable classes
*** Companion;
# lookup for serializable objects
*** INSTANCE;
kotlinx.serialization.KSerializer serializer(...);
-if @kotlinx.serialization.Serializable class
com.example.myapplication.HasNamedCompanion, # <-- List serializable classes with named companions.
com.example.myapplication.HasNamedCompanion2
{
static **$* *;
}
# lookup for plugin generated serializable classes
-if @kotlinx.serialization.Serializable class com.yourcompany.yourpackage.**
-keepclassmembers class com.yourcompany.yourpackage.<1>$Companion {
kotlinx.serialization.KSerializer serializer(...);
-keepnames class <1>$$serializer { # -keepnames suffices; class is kept when serializer() is kept.
static <1>$$serializer INSTANCE;
}
# Serialization supports named companions but for such classes it is necessary to add an additional rule.
# This rule keeps serializer and serializable class from obfuscation. Therefore, it is recommended not to use wildcards in it, but to write rules for each such class.
-keepattributes InnerClasses # Needed for `getDeclaredClasses`.
-keep class com.yourcompany.yourpackage.SerializableClassWithNamedCompanion$$serializer {
*** INSTANCE;
# Keep both serializer and serializable classes to save the attribute InnerClasses
-keepclasseswithmembers, allowshrinking, allowobfuscation, allowaccessmodification class
com.example.myapplication.HasNamedCompanion, # <-- List serializable classes with named companions.
com.example.myapplication.HasNamedCompanion2
{
*;
}
```
</details>

In case you want to exclude serializable classes that are used, but never serialized at runtime,
you will need to write custom rules with narrower [class specifications](https://www.guardsquare.com/manual/configuration/usage).

### Multiplatform (Common, JS, Native)

Most of the modules are also available for Kotlin/JS and Kotlin/Native.
@@ -286,8 +261,8 @@ Ensure the proper version of Kotlin and serialization version:

```xml
<properties>
<kotlin.version>1.7.20</kotlin.version>
<serialization.version>1.4.1</serialization.version>
<kotlin.version>1.8.10</kotlin.version>
<serialization.version>1.5.0</serialization.version>
</properties>
```

@@ -335,3 +310,9 @@ Add dependency on serialization runtime library:
<version>${serialization.version}</version>
</dependency>
```

### Bazel

To setup the Kotlin compiler plugin for Bazel, follow [the
example](https://github.com/bazelbuild/rules_kotlin/tree/master/examples/plugin/src/serialization)
from the `rules_kotlin` repository.
4 changes: 2 additions & 2 deletions benchmark/build.gradle
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@ apply plugin: 'me.champeau.jmh'

sourceCompatibility = 1.8
targetCompatibility = 1.8
jmh.jmhVersion = "1.22"
jmh.jmhVersion = "1.35"

processJmhResources {
doFirst {
@@ -26,7 +26,7 @@ jmhJar {
}

dependencies {
implementation 'org.openjdk.jmh:jmh-core:1.22'
implementation 'org.openjdk.jmh:jmh-core:1.35'
implementation 'com.google.guava:guava:31.1-jre'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3'
implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.13.3'
Loading