Arseniy Tashoyan created AVRO-3438:
--------------------------------------
Summary: NPE when serializing Avro GenericRecord with Kryo
Key: AVRO-3438
URL: https://issues.apache.org/jira/browse/AVRO-3438
Project: Apache Avro
Issue Type: Bug
Affects Versions: 1.10.2, 1.11.0
Reporter: Arseniy Tashoyan
We have an Apache Flink application, that processes Avro GenericRecords. Flink
uses Kryo serialization. The serialization fails:
com.esotericsoftware.kryo.KryoException: java.lang.NullPointerException
Serialization trace:
props (org.apache.avro.Schema$Field)
fieldMap (org.apache.avro.Schema$RecordSchema)
schema (org.apache.avro.generic.GenericData$Record)
values (org.apache.avro.generic.GenericData$Record)
values (org.apache.avro.generic.GenericData$Record)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:82)
~[kryo-2.24.0.jar:?]
at
com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:495)
~[kryo-2.24.0.jar:?]
at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:599)
~[kryo-2.24.0.jar:?]
at
com.esotericsoftware.kryo.serializers.MapSerializer.write(MapSerializer.java:95)
~[kryo-2.24.0.jar:?]
at
com.esotericsoftware.kryo.serializers.MapSerializer.write(MapSerializer.java:21)
~[kryo-2.24.0.jar:?]
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:523)
~[kryo-2.24.0.jar:?]
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:61)
~[kryo-2.24.0.jar:?]
at
com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:495)
~[kryo-2.24.0.jar:?]
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:523)
~[kryo-2.24.0.jar:?]
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:61)
~[kryo-2.24.0.jar:?]
...
Caused by: java.lang.NullPointerException
at org.apache.avro.JsonProperties$2$1$1.<init>(JsonProperties.java:175)
~[avro-1.10.2.jar:1.10.2]
at org.apache.avro.JsonProperties$2$1.iterator(JsonProperties.java:174)
~[avro-1.10.2.jar:1.10.2]
at
com.esotericsoftware.kryo.serializers.MapSerializer.write(MapSerializer.java:80)
~[kryo-2.24.0.jar:?]
at
com.esotericsoftware.kryo.serializers.MapSerializer.write(MapSerializer.java:21)
~[kryo-2.24.0.jar:?]
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:523)
~[kryo-2.24.0.jar:?]
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:61)
~[kryo-2.24.0.jar:?]
...
This problem occurs, because Kryo uses Unsafe to copy objects. When creating an
object, Unsafe does not call the class constructor. Therefore the field *props*
in the class JsonProperties is not properly initialized.
The field *props* is implemented via anonymous inner classes. A possible fix is
to avoid using anonymous classes, use normal classes instead.
A similar case:
https://stackoverflow.com/questions/36902471/inner-class-reference-to-enclosing-class-instance-is-null
--
This message was sent by Atlassian Jira
(v8.20.1#820001)