[ 
https://issues.apache.org/jira/browse/AVRO-3438?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17538782#comment-17538782
 ] 

Christophe Le Saec commented on AVRO-3438:
------------------------------------------

Hello [~tashoyan] ,

This code snippet
{code:java}
    void test() throws IOException {
        Kryo kryo = new Kryo();
        final URL resource = 
Thread.currentThread().getContextClassLoader().getResource(".");
        File data = new File(resource.getPath(), "file.dat");
        if (data.exists()) {
            data.delete();
        }
        data.createNewFile();
        Input input =  new Input(new FileInputStream(data));
        Output output = new Output(new FileOutputStream(data));
        
        final Schema schema = Schema.create(Schema.Type.LONG);
        schema.addProp("Hello", "World");
        
        kryo.register(schema.getClass(), new JavaSerializer());
        
        kryo.writeClassAndObject(output, schema);
        output.close();

        Schema theObject = (Schema) kryo.readClassAndObject(input);
        input.close();
        
        System.out.println("The shema : " + theObject.getClass().getName());
        System.out.println("  Hello : " + theObject.getProp("Hello"));
    }
{code}
work like a charm (with [kryo 
2.24.0|https://mvnrepository.com/artifact/com.esotericsoftware.kryo/kryo/2.24.0]
 and with more recent [Kryo 
5.3.0|https://mvnrepository.com/artifact/com.esotericsoftware/kryo/5.3.0]), 
tested with Avro 1.11.0 which still have this anonymous class.
Did i miss something ?

> 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
>          Components: java
>    Affects Versions: 1.11.0, 1.10.2
>            Reporter: Arseniy Tashoyan
>            Priority: Major
>
> 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. The NullPointerException 
> occurs at JsonProperties.java:175, because the reference to the enclosing 
> instance of AbstractSet is null.
> 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]
>  
> Avro: 1.10.2
> Kryo: 2.24.0
> Flink: 1.12.4



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to