Added kotlinx.serialization serializers
This commit is contained in:
@@ -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>(Color::class)
|
||||
object BoundingBoxSerializer: KSerializerForBukkit<BoundingBox>(BoundingBox::class)
|
||||
object ItemMetaSerializer: KSerializerForBukkit<ItemMeta>(ItemMeta::class)
|
||||
object ItemStackSerializer: KSerializerForBukkit<ItemStack>(ItemStack::class)
|
||||
object LocationSerializer: KSerializerForBukkit<Location>(Location::class)
|
||||
object VectorSerializer: KSerializerForBukkit<Vector>(Vector::class)
|
||||
|
||||
open class KSerializerForBukkit<T : ConfigurationSerializable>(
|
||||
private val kClass: KClass<T>
|
||||
) : KSerializer<T> {
|
||||
|
||||
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}")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user