fury icon indicating copy to clipboard operation
fury copied to clipboard

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

Open jeffreytkj opened this issue 1 year ago • 1 comments

Search before asking

  • [X] I had searched in the issues and found no similar issues.

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<String>) { 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?

  • [ ] I'm willing to submit a PR!

jeffreytkj avatar Sep 04 '24 11:09 jeffreytkj

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

chaokunyang avatar Sep 05 '24 11:09 chaokunyang