Skip to content

Scala 3 lazy vals break FieldSerializer #882

@nvollmar

Description

@nvollmar

Scala 3 changed the implementation of lazy vals. Classes containing a lazy val end up with a field called 0bitmap$1:

Compiled from "Test.scala"
public class Test implements scala.Product,java.io.Serializable {
  public static final long OFFSET$0;
  public long 0bitmap$1;
  private final byte a;
  ...

Trying to serialize an instance of such a class fails with

Cause: java.lang.ClassFormatError: Illegal field name "0bitmap$1" in class io/altoo/akka/serialization/kryo/TestFieldAccess
	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
	at com.esotericsoftware.reflectasm.AccessClassLoader.defineClass(AccessClassLoader.java:78)
	at com.esotericsoftware.reflectasm.AccessClassLoader.defineAccessClass(AccessClassLoader.java:57)
	at com.esotericsoftware.reflectasm.FieldAccess.get(FieldAccess.java:173)
	at com.esotericsoftware.kryo.serializers.CachedFields.addField(CachedFields.java:147)
	at com.esotericsoftware.kryo.serializers.CachedFields.rebuild(CachedFields.java:99)
	at com.esotericsoftware.kryo.serializers.FieldSerializer.<init>(FieldSerializer.java:82)
	at com.esotericsoftware.kryo.serializers.FieldSerializer.<init>(FieldSerializer.java:68)
	at jdk.internal.reflect.GeneratedConstructorAccessor27.newInstance(Unknown Source)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions