Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
1 of 2 tasks
jeffreytkj opened this issue Sep 4, 2024 · 1 comment
Open
1 of 2 tasks
Labels
bug Something isn't working

Comments

@jeffreytkj
Copy link

Search before asking

  • 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) {
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 jeffreytkj added the bug Something isn't working label Sep 4, 2024
@chaokunyang
Copy link
Collaborator

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants