Skip to content

Serialization with Afterburner causes Java VerifyError for generic with String as type #4

@imfuraisoth

Description

@imfuraisoth

java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

Jackson version: 2.7.0 (jackson-core, jackson-databind, jackson-annotations)
Afterburner version: 2.7.0

Please take following example and run it through an ObjectMapper with afterburner module registered.

public static abstract class AbstractMyClass<ID> {

    private ID id;

    AbstractMyClass(ID id) {
        setId(id);
    }

    public ID getId() {
        return id;
    }

    public void setId(ID id) {
        this.id = id;
    }
}

public static class MyClass extends AbstractMyClass<String> {
    public MyClass(String id) {
        super(id);
    }
}

Try to serialize MyClass and you will get the following error:

java.lang.VerifyError: Bad return type
Exception Details:
Location:
UnitTest$MyClass$Access4JacksonDeserializer26caf25d.stringGetter(Ljava/lang/Object;I)Ljava/lang/String; @10: areturn
Reason:
Type 'java/lang/Object' (current frame, stack[1]) is not assignable to 'java/lang/String' (from method signature)
Current Frame:
bci: @10
flags: { }
locals: { 'MyClass$Access4JacksonDeserializer26caf25d', 'java/lang/Object', integer, 'UnitTest$MyClass' }
stack: { integer, 'java/lang/Object' }
Bytecode:
0x0000000: 2bc0 000d 4e1c 2db6 0011 b0bb 0013 59bb
0x0000010: 0015 5912 17b7 001a 1cb6 001e b600 22b7
0x0000020: 0023 bf

at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
at java.lang.Class.getConstructor0(Class.java:3075)
at java.lang.Class.newInstance(Class.java:412)
at com.fasterxml.jackson.module.afterburner.ser.PropertyAccessorCollector.findAccessor(PropertyAccessorCollector.java:99)
at com.fasterxml.jackson.module.afterburner.ser.SerializerModifier.changeProperties(SerializerModifier.java:63)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.constructBeanSerializer(BeanSerializerFactory.java:401)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.findBeanSerializer(BeanSerializerFactory.java:271)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory._createSerializer2(BeanSerializerFactory.java:223)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:157)
at com.fasterxml.jackson.databind.SerializerProvider._createUntypedSerializer(SerializerProvider.java:1215)
at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:1167)
at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:490)
at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:688)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:107)
at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1428)
at com.fasterxml.jackson.databind.ObjectWriter._configAndWriteValue(ObjectWriter.java:1129)
at com.fasterxml.jackson.databind.ObjectWriter.writeValueAsString(ObjectWriter.java:1001)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions