diff --git a/forgeboot-core/forgeboot-core-serialization/.gitattributes b/forgeboot-core/forgeboot-core-serialization/.gitattributes new file mode 100644 index 0000000..8af972c --- /dev/null +++ b/forgeboot-core/forgeboot-core-serialization/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/forgeboot-core/forgeboot-core-serialization/.gitignore b/forgeboot-core/forgeboot-core-serialization/.gitignore new file mode 100644 index 0000000..5a979af --- /dev/null +++ b/forgeboot-core/forgeboot-core-serialization/.gitignore @@ -0,0 +1,40 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Kotlin ### +.kotlin diff --git a/forgeboot-core/forgeboot-core-serialization/build.gradle.kts b/forgeboot-core/forgeboot-core-serialization/build.gradle.kts new file mode 100644 index 0000000..ccf1517 --- /dev/null +++ b/forgeboot-core/forgeboot-core-serialization/build.gradle.kts @@ -0,0 +1,4 @@ + +dependencies { + implementation(libs.jackson.databind) +} diff --git a/forgeboot-core/forgeboot-core-serialization/src/main/kotlin/com/gewuyou/forgeboot/core/serialization/exception/SerializerException.kt b/forgeboot-core/forgeboot-core-serialization/src/main/kotlin/com/gewuyou/forgeboot/core/serialization/exception/SerializerException.kt new file mode 100644 index 0000000..c382f87 --- /dev/null +++ b/forgeboot-core/forgeboot-core-serialization/src/main/kotlin/com/gewuyou/forgeboot/core/serialization/exception/SerializerException.kt @@ -0,0 +1,17 @@ +package com.gewuyou.forgeboot.core.serialization.exception + +/** + * 序列化异常类,用于封装与序列化操作相关的异常信息。 + * + * @param message 异常的详细描述信息,默认为 null。 + * @param cause 导致此异常的底层异常,默认为 null。 + * + * @since 2025-06-17 21:14:40 + * @author gewuyou + */ +class SerializerException( + message: String? = null, + cause: Throwable? = null, +) : RuntimeException( + message, cause +) \ No newline at end of file diff --git a/forgeboot-core/forgeboot-core-serialization/src/main/kotlin/com/gewuyou/forgeboot/core/serialization/serializer/ValueSerializer.kt b/forgeboot-core/forgeboot-core-serialization/src/main/kotlin/com/gewuyou/forgeboot/core/serialization/serializer/ValueSerializer.kt new file mode 100644 index 0000000..e7f0562 --- /dev/null +++ b/forgeboot-core/forgeboot-core-serialization/src/main/kotlin/com/gewuyou/forgeboot/core/serialization/serializer/ValueSerializer.kt @@ -0,0 +1,26 @@ +package com.gewuyou.forgeboot.core.serialization.serializer + +/** + * 值序列化器接口,用于定义将对象序列化为字符串以及从字符串反序列化为对象的方法。 + * + * @since 2025-06-16 22:16:19 + * @author gewuyou + */ +interface ValueSerializer { + + /** + * 将给定的对象序列化为字符串。 + * + * @param value 要序列化的对象 + * @return 序列化后的字符串表示形式 + */ + fun serialize(value: Any): String + + /** + * 将给定的字符串反序列化为对象。 + * + * @param value 要反序列化的字符串 + * @return 反序列化后的对象 + */ + fun deserialize(value: String, type: Class): T +} \ No newline at end of file diff --git a/forgeboot-core/forgeboot-core-serialization/src/main/kotlin/com/gewuyou/forgeboot/core/serialization/serializer/impl/serializer/JacksonValueSerializer.kt b/forgeboot-core/forgeboot-core-serialization/src/main/kotlin/com/gewuyou/forgeboot/core/serialization/serializer/impl/serializer/JacksonValueSerializer.kt new file mode 100644 index 0000000..2c36514 --- /dev/null +++ b/forgeboot-core/forgeboot-core-serialization/src/main/kotlin/com/gewuyou/forgeboot/core/serialization/serializer/impl/serializer/JacksonValueSerializer.kt @@ -0,0 +1,70 @@ +package com.gewuyou.forgeboot.core.serialization.serializer.impl.serializer + +import com.fasterxml.jackson.core.JsonProcessingException +import com.fasterxml.jackson.databind.ObjectMapper +import com.gewuyou.forgeboot.core.serialization.exception.SerializerException +import com.gewuyou.forgeboot.core.serialization.serializer.ValueSerializer + + +/** + * Jackson 值序列化器,用于将对象序列化为 JSON 字符串或将 JSON 字符串反序列化为对象。 + * + * @param mapper 用于执行序列化和反序列化的 Jackson ObjectMapper 实例 + * @since 2025-06-18 12:37:59 + * @author gewuyou + */ +class JacksonValueSerializer( + private val mapper: ObjectMapper, +) : ValueSerializer { + /** + * 将给定的对象序列化为字符串。 + * + * @param value 要序列化的对象 + * @return 序列化后的字符串表示形式 + */ + override fun serialize(value: Any): String { + // 对于基本类型或者 String,直接返回 + if (value is String || value.javaClass.isPrimitive) { + return value.toString() + } + return try { + mapper.writeValueAsString(value) + } catch (e: JsonProcessingException) { + throw SerializerException("Failed to serialize value: ${e.message}", e) + } + } + + /** + * 将给定的字符串反序列化为对象。 + * + * @param value 要反序列化的字符串 + * @return 反序列化后的对象 + */ + @Suppress("UNCHECKED_CAST") + override fun deserialize(value: String, type: Class): T { + // 对于 String 类型,直接返回 + if (type == String::class.java) { + return value as T + } + // 对于基本类型,使用相应的 valueOf 方法进行转换 + if (type.isPrimitive) { + return when (type) { + Boolean::class.java -> value.toBoolean() as T + Integer::class.java, Int::class.java -> value.toInt() as T + Long::class.java, java.lang.Long::class.java -> value.toLong() as T + Double::class.java, java.lang.Double::class.java -> value.toDouble() as T + Float::class.java, java.lang.Float::class.java -> value.toFloat() as T + Short::class.java, java.lang.Short::class.java -> value.toShort() as T + Byte::class.java, java.lang.Byte::class.java -> value.toByte() as T + Character::class.java -> value[0] as T // 取第一个字符作为字符 + else -> throw SerializerException("Unsupported primitive type: ${type.name}") + } + } + return try { + mapper.readValue(value, type) + } catch (e: JsonProcessingException) { + throw SerializerException("Failed to deserialize value: ${e.message}", e) + } + } + +} \ No newline at end of file