Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法在Kotlinx序列化中序列化映射_Java_Dictionary_Kotlin_Serialization - Fatal编程技术网

Java 有没有办法在Kotlinx序列化中序列化映射

Java 有没有办法在Kotlinx序列化中序列化映射,java,dictionary,kotlin,serialization,Java,Dictionary,Kotlin,Serialization,我正在使用Kotlin 1.3.10(并绑定到此版本)和Kotlinx Serialization 0.13,在Kotlinx Serialization中序列化映射时遇到问题 我有以下代码: @Serializer(forClass = LocalDate::class) object LocalDateSerializer : KSerializer<LocalDate> { private val formatter: DateTimeFormatter = DateT

我正在使用Kotlin 1.3.10(并绑定到此版本)和Kotlinx Serialization 0.13,在Kotlinx Serialization中序列化映射时遇到问题

我有以下代码:

@Serializer(forClass = LocalDate::class)
object LocalDateSerializer : KSerializer<LocalDate> {
    private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
    override val descriptor: SerialDescriptor
        get() = StringDescriptor.withName("LocalDate")
    override fun serialize(encoder: Encoder, obj: LocalDate) {
        encoder.encodeString(obj.format(formatter))
    }
    override fun deserialize(decoder: Decoder): LocalDate {
        return LocalDate.parse(decoder.decodeString(), formatter)
    }
}

@Serializable
data class MyClass (
    val students: Map<String,LocalDate>
)

@UnstableDefault
@Test
fun decodeEncodeSerialization() {
    val jsonParser = Json(
        JsonConfiguration(
            allowStructuredMapKeys = true
        )
    )
    val mc = MyClass(
        mapOf("Alex" to LocalDate.of(1997,2,23))
        )

    val mcJson = jsonParser.stringify(MyClass.serializer(), mc)
    val mcObject = jsonParser.parse(MyClass.serializer(), mcJson)

    assert(true)
}
但有了地图,我似乎不知道该怎么做。我把它放在物体上方或旁边

@Serializable
data class MyClass (
    val students: Map<String,@Serializable(with = LocalDateSerializer::class) LocalDate> //here
    //or 
    //@Serializable(with = LocalDateSerializer::class)
    //val students2: Map<String, LocalDate> //here 
)
@Serializable
数据类MyClass(
学生们:地图//在这里
//或
//@可序列化(with=LocalDateSerializer::class)
//val学生2:地图//这里
)
…但测试仍然失败

kotlinx.serialization.SerializationException:找不到类java.time.LocalDate的无参数序列化程序(Kotlin反射不可用)。对于泛型类,如列表,请显式提供序列化程序

我的解决办法是

@Serializable
data class MyClass (
    val students: List<Student>
)
@Serializable
data class Student (
    val name: String,
    @Serializable(with = LocalDateSerializer::class)
    val dob: LocalDate
)
@Serializable
数据类MyClass(
学生名单
)
@可序列化
数据类学生(
val name:String,
@可序列化(with=LocalDateSerializer::class)
val-dob:LocalDate
)
有没有一种方法我不会求助于解决方法?谢谢大家!

@file:UseSerializers(LocalDateSerializer::class)
将它放在声明对象的文件中,每次看到本地日期时,它都应该使用LocalDateSerializer

@file:UseSerializers(LocalDateSerializer::class)