From 32a8de699cfa74c874bee4517db59cca3c740cbc Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Thu, 8 Jun 2023 22:22:14 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20ListSerializer=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usbharu/ap/model/json/ListSerializer.kt | 24 +++++++++++++++++++ .../usbharu/ap/model/json/StringSerializer.kt | 8 ++++++- .../ap/serialization/SerializerSpecImpl.kt | 4 ++-- .../dev/usbharu/ap/ListSerializerTest.kt | 19 +++++++++++++++ .../dev/usbharu/ap/PersonSerializeTest.kt | 2 +- 5 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/dev/usbharu/ap/model/json/ListSerializer.kt create mode 100644 src/test/kotlin/dev/usbharu/ap/ListSerializerTest.kt diff --git a/src/main/kotlin/dev/usbharu/ap/model/json/ListSerializer.kt b/src/main/kotlin/dev/usbharu/ap/model/json/ListSerializer.kt new file mode 100644 index 0000000..3ae938f --- /dev/null +++ b/src/main/kotlin/dev/usbharu/ap/model/json/ListSerializer.kt @@ -0,0 +1,24 @@ +package dev.usbharu.ap.model.json + +import dev.usbharu.ap.serialization.Deserializable +import dev.usbharu.ap.serialization.Serializable +import dev.usbharu.ap.serialization.SerializerSpec +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.buildJsonArray +import kotlin.reflect.KClass + +class ListSerializer(private val clazz: KClass) : Serializable>, Deserializable> { + override fun deserialize(spec: SerializerSpec, element: JsonElement): List { + if (element is JsonArray) { + return element.map { spec.deserializer(clazz).deserialize(spec, it) } + } + return listOf(spec.deserializer(clazz).deserialize(spec, element)) + } + + override fun serialize(spec: SerializerSpec, value: List): JsonElement { + return buildJsonArray { + value.forEach { add(spec.serializer(clazz).serialize(spec, it)) } + } + } +} diff --git a/src/main/kotlin/dev/usbharu/ap/model/json/StringSerializer.kt b/src/main/kotlin/dev/usbharu/ap/model/json/StringSerializer.kt index cc6caa1..1ba6e22 100644 --- a/src/main/kotlin/dev/usbharu/ap/model/json/StringSerializer.kt +++ b/src/main/kotlin/dev/usbharu/ap/model/json/StringSerializer.kt @@ -1,12 +1,18 @@ package dev.usbharu.ap.model.json import dev.usbharu.ap.serialization.Deserializable +import dev.usbharu.ap.serialization.Serializable import dev.usbharu.ap.serialization.SerializerSpec import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.jsonPrimitive -object StringSerializer : Deserializable { +object StringSerializer : Deserializable,Serializable { override fun deserialize(spec: SerializerSpec, element: JsonElement): String { return element.jsonPrimitive.content } + + override fun serialize(spec: SerializerSpec, value: String): JsonElement { + return JsonPrimitive(value) + } } diff --git a/src/main/kotlin/dev/usbharu/ap/serialization/SerializerSpecImpl.kt b/src/main/kotlin/dev/usbharu/ap/serialization/SerializerSpecImpl.kt index 3cdae70..e6d57d7 100644 --- a/src/main/kotlin/dev/usbharu/ap/serialization/SerializerSpecImpl.kt +++ b/src/main/kotlin/dev/usbharu/ap/serialization/SerializerSpecImpl.kt @@ -4,8 +4,8 @@ import kotlinx.serialization.json.JsonElement import kotlin.reflect.KClass class SerializerSpecImpl( - val deserializers: MutableMap, Deserializable<*>> = mutableMapOf(), - val serializers: Map, Serializable<*>> = emptyMap() + val deserializers: Map, Deserializable<*>> = emptyMap(), + val serializers: Map, Serializable<*>> = emptyMap(), ) : SerializerSpec { override fun deserializer(clazz: KClass): Deserializable = deserializers.getValue(clazz) as Deserializable diff --git a/src/test/kotlin/dev/usbharu/ap/ListSerializerTest.kt b/src/test/kotlin/dev/usbharu/ap/ListSerializerTest.kt new file mode 100644 index 0000000..7acf29e --- /dev/null +++ b/src/test/kotlin/dev/usbharu/ap/ListSerializerTest.kt @@ -0,0 +1,19 @@ +package dev.usbharu.ap + +import dev.usbharu.ap.model.json.StringSerializer +import dev.usbharu.ap.serialization.SerializerSpecImpl +import dev.usbharu.ap.serialization.serialize +import org.junit.jupiter.api.Test + +class ListSerializerTest { + @Test + fun Listをシリアライズ出来るか() { + val serializerSpecImpl = SerializerSpecImpl( + serializers = mapOf( + List::class to dev.usbharu.ap.model.json.ListSerializer(String::class), + String::class to StringSerializer + ) + ) + println(serializerSpecImpl.serialize(listOf(1,2,3))) + } +} diff --git a/src/test/kotlin/dev/usbharu/ap/PersonSerializeTest.kt b/src/test/kotlin/dev/usbharu/ap/PersonSerializeTest.kt index b0d1199..9ff3b59 100644 --- a/src/test/kotlin/dev/usbharu/ap/PersonSerializeTest.kt +++ b/src/test/kotlin/dev/usbharu/ap/PersonSerializeTest.kt @@ -33,7 +33,7 @@ class PersonSerializeTest { Person::class to Person.Companion, PrimitiveOrArray::class to PrimitiveOrArray.Companion, PublicKey::class to PublicKey.Companion, - Image::class to Image.Companion + Image::class to Image.Companion, ) ).serialize(person) println(serialize)