apache / fury

A blazingly fast multi-language serialization framework powered by JIT and zero-copy.
https://fury.apache.org/
Apache License 2.0
3.07k stars 245 forks source link

Language.XLANG MutableMap.withDefault { null } causes serialization failure #1827

Open jeffreytkj opened 1 month ago

jeffreytkj commented 1 month ago

Search before asking

Version

0.7.0

Component(s)

Java

Minimal reproduce step

class Test { var id: Long? = null var map: MutableMap<String, Any?>

constructor(map: Map<String, Any?>) {
    val camelCaseMap = mutableMapOf<String, Any?>()
    for ((k, v) in map) {
        // Change to camel case
        val prop = toCamelCase(k)
        camelCaseMap[prop] = v
    }
    this.map = camelCaseMap.withDefault { null }
}

fun toCamelCase(name: String): String {
    if (name.isEmpty()) {
        return ""
    }
    var camelCase = name.substring(0, 1).toLowerCase()

    if (name.length > 1) {
        var wordStart = false;

        for (i in 1..(name.length - 1)) {
            var currChar = name[i]
            if (currChar == '_') {
                wordStart = true
            } else {
                if (wordStart) {
                    camelCase += currChar.toUpperCase()
                } else {
                    camelCase += currChar.toLowerCase()
                }
                wordStart = false
            }
        }
    }
    return camelCase
}

}

fun main(args: Array) { println("Hello World!")

// Try adding program arguments via Run/Debug configuration.
// Learn more about running applications: https://www.jetbrains.com/help/idea/running-applications.html.
println("Program arguments: ${args.joinToString()}")
val fury = Fury.builder()..withLanguage(Language.XLANG).build()
fury.register(Test::class.java)
val bytes = fury.serializeJavaObject(Test(mapOf("id" to "123")))
println(fury.deserializeJavaObject(bytes, Test::class.java))

}

What did you expect to see?

Able to serialize Test object and deserialize it to see the values of the properties with Language.XLANG

What did you see instead?

Class class kotlin.collections.MutableMapWithDefaultImpl doesn't have a no-arg constructor

java.lang.RuntimeException: Class class kotlin.collections.MutableMapWithDefaultImpl doesn't have a no-arg constructor\n\tat org.apache.fury.reflect.ReflectionUtils.getCtrHandle(ReflectionUtils.java:126)\n\tat org.apache.fury.serializer.collection.AbstractMapSerializer.newMap(AbstractMapSerializer.java:791)

Anything Else?

No response

Are you willing to submit a PR?

chaokunyang commented 1 month ago

Fury XLANG doesn't support kotlin yet, please use Language.JAVA instead. Currently FURY support kotlin by implementing JDK serialization interface, we have not check kotlin class type and optimize for kotlin types yet. The xlang serialization won't follow JDK serialization interface, so we do not support kotlin for xlang serialization yet