Add Serializer
This commit is contained in:
16
src/main/kotlin/fr/postgresjson/entity/Entity.kt
Normal file
16
src/main/kotlin/fr/postgresjson/entity/Entity.kt
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package fr.postgresjson.entity
|
||||||
|
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
interface EntityI<T> {
|
||||||
|
var id: T
|
||||||
|
}
|
||||||
|
abstract class Entity<T>(override var id: T) : EntityI<T>
|
||||||
|
abstract class UuidEntity(override var id: UUID = UUID.randomUUID()) : Entity<UUID>(id) {}
|
||||||
|
abstract class IdEntity(override var id: Int) : Entity<Int>(id)
|
||||||
|
|
||||||
|
interface EntityVersioning<T> {
|
||||||
|
var version: T
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EntityVersioningIncrement : EntityVersioning<Int>
|
||||||
23
src/main/kotlin/fr/postgresjson/serializer/Serializer.kt
Normal file
23
src/main/kotlin/fr/postgresjson/serializer/Serializer.kt
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package fr.postgresjson.serializer
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper
|
||||||
|
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||||
|
import com.fasterxml.jackson.module.kotlin.readValue
|
||||||
|
import fr.postgresjson.entity.Entity
|
||||||
|
|
||||||
|
class Serializer(val mapper: ObjectMapper = jacksonObjectMapper()) {
|
||||||
|
fun serialize(source: Any): String {
|
||||||
|
return mapper.writeValueAsString(source)
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <reified T>deserialize(json: String): T {
|
||||||
|
return mapper.readValue(json)
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <reified T>deserialize(json: String, target: T): T {
|
||||||
|
return mapper.readerForUpdating(target).readValue(json)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> Entity<T>.serialize() = Serializer().serialize(this)
|
||||||
|
inline fun <reified T> T.deserialize(json: String) = Serializer().deserialize(json, this)
|
||||||
59
src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt
Normal file
59
src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
package fr.postgresjson.serializer
|
||||||
|
|
||||||
|
import fr.postgresjson.entity.UuidEntity
|
||||||
|
import org.junit.jupiter.api.Assertions.assertEquals
|
||||||
|
import org.junit.jupiter.api.Assertions.assertTrue
|
||||||
|
import org.junit.jupiter.api.BeforeEach
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import org.junit.jupiter.api.TestInstance
|
||||||
|
|
||||||
|
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
||||||
|
internal class SerializerTest {
|
||||||
|
class ObjTest(var val1: String, var val2: Int) : UuidEntity()
|
||||||
|
|
||||||
|
private val serializer = Serializer()
|
||||||
|
|
||||||
|
private val objSerialized = """{"val1":"plop","val2":123,"id":"1362a162-df75-4995-ab46-4ad55fa07de2"}"""
|
||||||
|
private val objSerializedUpdate = """{"val1":"update","val2":123}"""
|
||||||
|
private lateinit var obj: ObjTest
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
fun before() {
|
||||||
|
obj = ObjTest("plop", 123)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun serialize() {
|
||||||
|
val json = serializer.serialize(obj)
|
||||||
|
assertTrue(json.contains("\"val1\":\"plop\",\"val2\":123"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun serialize2() {
|
||||||
|
val json = obj.serialize()
|
||||||
|
assertTrue(json.contains("\"val1\":\"plop\",\"val2\":123"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun deserialize() {
|
||||||
|
val objDeserialized: ObjTest = serializer.deserialize(objSerialized)
|
||||||
|
assertEquals(obj.val1, objDeserialized.val1)
|
||||||
|
assertEquals(obj.val2, objDeserialized.val2)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun deserializeUpdate() {
|
||||||
|
val objDeserialized: ObjTest = serializer.deserialize(objSerializedUpdate, obj)
|
||||||
|
assertTrue(obj === objDeserialized)
|
||||||
|
assertEquals("update", objDeserialized.val1)
|
||||||
|
assertEquals(123, objDeserialized.val2)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun deserializeUpdate2() {
|
||||||
|
val objDeserialized: ObjTest = obj.deserialize(objSerializedUpdate)
|
||||||
|
assertTrue(obj === objDeserialized)
|
||||||
|
assertEquals("update", objDeserialized.val1)
|
||||||
|
assertEquals(123, objDeserialized.val2)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user