From 7c2f61d2a72ade0ce73860b641b8debce212c36a Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Fri, 23 Oct 2020 17:39:10 +0200 Subject: [PATCH] Added kotlinx.serialization serializers --- .../ConfigurationSerializableAdapter.kt | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/main/kotlin/net/axay/kspigot/serialization/ConfigurationSerializableAdapter.kt diff --git a/src/main/kotlin/net/axay/kspigot/serialization/ConfigurationSerializableAdapter.kt b/src/main/kotlin/net/axay/kspigot/serialization/ConfigurationSerializableAdapter.kt new file mode 100644 index 00000000..e90bca62 --- /dev/null +++ b/src/main/kotlin/net/axay/kspigot/serialization/ConfigurationSerializableAdapter.kt @@ -0,0 +1,50 @@ +package net.axay.kspigot.serialization + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.ByteArraySerializer +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import org.bukkit.Color +import org.bukkit.Location +import org.bukkit.configuration.serialization.ConfigurationSerializable +import org.bukkit.inventory.ItemStack +import org.bukkit.inventory.meta.ItemMeta +import org.bukkit.util.BoundingBox +import org.bukkit.util.Vector +import org.bukkit.util.io.BukkitObjectInputStream +import org.bukkit.util.io.BukkitObjectOutputStream +import java.io.ByteArrayOutputStream +import kotlin.reflect.KClass + +object ColorSerializer: KSerializerForBukkit(Color::class) +object BoundingBoxSerializer: KSerializerForBukkit(BoundingBox::class) +object ItemMetaSerializer: KSerializerForBukkit(ItemMeta::class) +object ItemStackSerializer: KSerializerForBukkit(ItemStack::class) +object LocationSerializer: KSerializerForBukkit(Location::class) +object VectorSerializer: KSerializerForBukkit(Vector::class) + +open class KSerializerForBukkit( + private val kClass: KClass +) : KSerializer { + + override val descriptor = ByteArraySerializer().descriptor + + override fun serialize(encoder: Encoder, value: T) { + val bytes = ByteArrayOutputStream() + BukkitObjectOutputStream(bytes).use { + it.writeObject(value) + } + encoder.encodeSerializableValue(ByteArraySerializer(), bytes.toByteArray()) + } + + override fun deserialize(decoder: Decoder): T { + BukkitObjectInputStream( + decoder.decodeSerializableValue(ByteArraySerializer()).inputStream() + ).use { + @Suppress("UNCHECKED_CAST") + return it.readObject() as? T + ?: throw IllegalStateException("The object can not be deserialized to an object of the type ${kClass.simpleName}") + } + } + +} \ No newline at end of file