Skip to content

Commit

Permalink
Kotlin 1.4.0 fixes for kotlin serialization
Browse files Browse the repository at this point in the history
  • Loading branch information
motorro committed Aug 19, 2020
1 parent 45f0945 commit 21d3e7e
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 13 deletions.
4 changes: 2 additions & 2 deletions kserializer/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

api "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
api "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0"
api "org.jetbrains.kotlinx:kotlinx-serialization-cbor:0.20.0"
api "org.jetbrains.kotlinx:kotlinx-serialization-core:1.0.0-RC"
api "org.jetbrains.kotlinx:kotlinx-serialization-cbor:1.0.0-RC"

testImplementation "junit:junit:${commonLibVersions.junit}"
testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,19 @@ package com.motorro.rxlcemodel.kserializer
import com.motorro.rxlcemodel.base.service.DataWithCacheKey
import kotlinx.serialization.*
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
import kotlinx.serialization.encoding.CompositeDecoder
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

/**
* Serializer for [DataWithCacheKey]
*/
@Serializer(forClass = DataWithCacheKey::class)
data class DataWithCacheKeySerializer<D: Any>(val dataSerializer: KSerializer<D>):
KSerializer<DataWithCacheKey<D>> {
override val descriptor: SerialDescriptor = SerialDescriptor("DataWithCacheKey") {
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("DataWithCacheKey") {
element("data", dataSerializer.descriptor)
element("cacheKey", String.serializer().descriptor)
}
Expand All @@ -42,7 +47,7 @@ data class DataWithCacheKeySerializer<D: Any>(val dataSerializer: KSerializer<D>

loop@ while (true) {
when (val i = inp.decodeElementIndex(descriptor)) {
CompositeDecoder.READ_DONE -> break@loop
CompositeDecoder.DECODE_DONE -> break@loop
0 -> data = inp.decodeSerializableElement(descriptor, i, dataSerializer)
1 -> cacheKey = inp.decodeStringElement(descriptor, i)
else -> throw SerializationException("Unknown index $i")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,7 @@ import com.motorro.rxlcemodel.base.entity.Entity
import com.motorro.rxlcemodel.base.entity.EntityValidator
import com.motorro.rxlcemodel.base.entity.EntityValidatorFactory
import com.motorro.rxlcemodel.base.service.CacheDelegateSerializerDeserializer
import kotlinx.serialization.BinaryFormat
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.*
import kotlinx.serialization.cbor.Cbor
import java.io.InputStream
import java.io.OutputStream
Expand Down Expand Up @@ -68,7 +66,7 @@ class KotlinCacheDelegateSerializer<D: Any>(
*/
override fun serialize(entity: Entity<D>, output: OutputStream) = output.use {
it.write(
binaryFormat.dump(
binaryFormat.encodeToByteArray(
Storage.serializer(kSerializer),
Storage(entity)
)
Expand All @@ -85,7 +83,7 @@ class KotlinCacheDelegateSerializer<D: Any>(
*/
override fun deserializeSnapshot(input: InputStream, length: Long, invalidated: Boolean): Entity<D>? = kotlin.runCatching {
input.use {
Cbor.load(
Cbor.decodeFromByteArray(
Storage.serializer(kSerializer),
it.readBytes()
).toEntity(invalidated)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,29 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/

@file:UseSerializers(DataWithCacheKeySerializer::class)

package com.motorro.rxlcemodel.kserializer

import com.motorro.rxlcemodel.base.service.DataWithCacheKey
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.UseSerializers
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonConfiguration
import kotlinx.serialization.parse
import kotlinx.serialization.stringify
import org.junit.Test

class DataWithCacheKeySerializerTest() {
private val json = Json(JsonConfiguration.Stable)
private val json = Json { allowStructuredMapKeys = true }
private val serializer = DataWithCacheKeySerializer(String.serializer())

@Test
fun serializes() {
val dataWithKey = DataWithCacheKey("string", "key")
val jsonData = json.stringify(serializer, dataWithKey)
val fromJson = json.parse(serializer, jsonData)
val jsonData = json.encodeToString(serializer, dataWithKey)
val fromJson = json.decodeFromString(serializer, jsonData)
kotlin.test.assertEquals(dataWithKey, fromJson)
}
}

0 comments on commit 21d3e7e

Please sign in to comment.