kotlinx.serialization
kotlinx.serialization copied to clipboard
Transient atomic field not found
Describe the bug The automatic serializer throws on transient atomic fields, but manually written one works.
java.lang.NoSuchFieldError: Class ninja.blacknet.db.PeerDB$Entry does not have member field 'kotlinx.atomicfu.AtomicBoolean inContact'
at ninja.blacknet.db.PeerDB$Entry.<init>(PeerDB.kt:356)
at ninja.blacknet.db.PeerDB$Entry$$serializer.deserialize(PeerDB.kt:356)
at ninja.blacknet.db.PeerDB$Entry$$serializer.deserialize(PeerDB.kt:356)
at ninja.blacknet.serialization.bbf.BinaryFormat.decodeFromPacket(BinaryFormat.kt:31)
at ninja.blacknet.serialization.bbf.BinaryFormat.decodeFromByteArray(BinaryFormat.kt:26)
at ninja.blacknet.db.PeerDBTest.entry(PeerDBTest.kt:44)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
To Reproduce
@Serializable
class Entry(
/* ... */
) {
@Transient
private val inContact = atomic(false)
}
Expected behavior
Environment
- Kotlin version: 1.9.22
- Library version: 1.6.3
- Kotlin platforms: JVM
- Atomicfu version: 0.23.2
It looks like some misunderstanding between serialization and atomicfu plugins. As far as I remember, atomicfu actually removes inContact
field from the class. @mvicsokolova Can you take a look at this?
Indeed, the exception happens if atomicfu transforms IR, but post-compilation transformation works.
I'm looking at this problem, kotlinx-atomicfu
plugin replaces inContact
field with a volatile property, that is atomically updated. Probably some metadata was left. 👀