[ 
https://issues.apache.org/jira/browse/AVRO-1865?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alexander Kasper updated AVRO-1865:
-----------------------------------
    Description: 
When trying to serialize Java classes generated by Avro that contain a field as 
follows:
{{array<MyClass> myclasses = []}}

serialization fails with the following error message
{{com.esotericsoftware.kryo.KryoException: Class cannot be created (missing 
no-arg constructor)}}

Minimum example to recreate this:
Avro IDL definition:
{code:java}
@namespace("com.adello")
protocol KryoTest {
        record TestRecord {
                array<int> values = [];
        }
}
{code}

This gets compiled using {{java -jar avro-tools-1.8.1.jar idl2schemata 
kryo.avdl .}}
Resulting Avro schema:
{code:javascript}
{
  "type" : "record",
  "name" : "TestRecord",
  "namespace" : "com.adello",
  "fields" : [ {
    "name" : "values",
    "type" : {
      "type" : "array",
      "items" : "int"
    },
    "default" : [ ]
  } ]
}
{code}

Generate Java class using {{java -jar avro-tools-1.8.1.jar compile schema 
TestRecord.avsc}}

Kryo serialization test code:
{code:java}
Kryo kryo = new Kryo();
try {
            Output output = new Output(new FileOutputStream("test.bin"));
            TestRecord o = TestRecord.newBuilder().build();
            System.out.println("Before serialization: ");
            System.out.println(o.toString());
            kryo.writeObject(output, o);
            output.close();

            Input input = new Input(new FileInputStream("test.bin"));
            TestRecord i = kryo.readObject(input, TestRecord.class);
            input.close();
            System.out.println("After deserialization: ");
            System.out.println(i.toString());

            System.out.println(Objects.deepEquals(o, i));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
{code}

This is a common enough issue with Kryo that they have a dedicated section on 
their website on it: 
http://docs.datatorrent.com/troubleshooting/#application-throwing-following-kryo-exception

The attached patch adds a no args constructor for the inner class Array of 
GenericData with zero entries and a dummy schema. My personal tests for 
serialization with Kryo were successful when using it. Since I do not have 
complete insight into Avro I'd like to know if this could be a breaking change 
and how to test it if so.

  was:
When trying to serialize Java classes generated by Avro that contain a field as 
follows:
{{array<MyClass> myclasses = []}}

serialization fails with the following error message
{{com.esotericsoftware.kryo.KryoException: Class cannot be created (missing 
no-arg constructor)}}

Minimum example to recreate this:
Avro IDL definition:
{code:java}
@namespace("com.adello")
protocol KryoTest {
        record TestRecord {
                array<int> values = [];
        }
}
{code}

This gets compiled using {{java -jar avro-tools-1.8.1.jar idl2schemata 
kryo.avdl .}}
Resulting Avro schema:
{code:javascript}
{
  "type" : "record",
  "name" : "TestRecord",
  "namespace" : "com.adello",
  "fields" : [ {
    "name" : "values",
    "type" : {
      "type" : "array",
      "items" : "int"
    },
    "default" : [ ]
  } ]
}
{code}

Kryo serialization test code:
{code:java}
Kryo kryo = new Kryo();
try {
            Output output = new Output(new FileOutputStream("test.bin"));
            TestRecord o = TestRecord.newBuilder().build();
            System.out.println("Before serialization: ");
            System.out.println(o.toString());
            kryo.writeObject(output, o);
            output.close();

            Input input = new Input(new FileInputStream("test.bin"));
            TestRecord i = kryo.readObject(input, TestRecord.class);
            input.close();
            System.out.println("After deserialization: ");
            System.out.println(i.toString());

            System.out.println(Objects.deepEquals(o, i));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
{code}

This is a common enough issue with Kryo that they have a dedicated section on 
their website on it: 
http://docs.datatorrent.com/troubleshooting/#application-throwing-following-kryo-exception

The attached patch adds a no args constructor for the inner class Array of 
GenericData with zero entries and a dummy schema. My personal tests for 
serialization with Kryo were successful when using it. Since I do not have 
complete insight into Avro I'd like to know if this could be a breaking change 
and how to test it if so.


> GenericData.Array class missing no arg constructor for Kryo serialization
> -------------------------------------------------------------------------
>
>                 Key: AVRO-1865
>                 URL: https://issues.apache.org/jira/browse/AVRO-1865
>             Project: Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.8.1
>            Reporter: Alexander Kasper
>              Labels: newbie, patch
>         Attachments: add-no-arg-ctor-genericdata-array.diff
>
>
> When trying to serialize Java classes generated by Avro that contain a field 
> as follows:
> {{array<MyClass> myclasses = []}}
> serialization fails with the following error message
> {{com.esotericsoftware.kryo.KryoException: Class cannot be created (missing 
> no-arg constructor)}}
> Minimum example to recreate this:
> Avro IDL definition:
> {code:java}
> @namespace("com.adello")
> protocol KryoTest {
>       record TestRecord {
>               array<int> values = [];
>       }
> }
> {code}
> This gets compiled using {{java -jar avro-tools-1.8.1.jar idl2schemata 
> kryo.avdl .}}
> Resulting Avro schema:
> {code:javascript}
> {
>   "type" : "record",
>   "name" : "TestRecord",
>   "namespace" : "com.adello",
>   "fields" : [ {
>     "name" : "values",
>     "type" : {
>       "type" : "array",
>       "items" : "int"
>     },
>     "default" : [ ]
>   } ]
> }
> {code}
> Generate Java class using {{java -jar avro-tools-1.8.1.jar compile schema 
> TestRecord.avsc}}
> Kryo serialization test code:
> {code:java}
> Kryo kryo = new Kryo();
> try {
>             Output output = new Output(new FileOutputStream("test.bin"));
>             TestRecord o = TestRecord.newBuilder().build();
>             System.out.println("Before serialization: ");
>             System.out.println(o.toString());
>             kryo.writeObject(output, o);
>             output.close();
>             Input input = new Input(new FileInputStream("test.bin"));
>             TestRecord i = kryo.readObject(input, TestRecord.class);
>             input.close();
>             System.out.println("After deserialization: ");
>             System.out.println(i.toString());
>             System.out.println(Objects.deepEquals(o, i));
>         } catch (FileNotFoundException e) {
>             e.printStackTrace();
>         }
> {code}
> This is a common enough issue with Kryo that they have a dedicated section on 
> their website on it: 
> http://docs.datatorrent.com/troubleshooting/#application-throwing-following-kryo-exception
> The attached patch adds a no args constructor for the inner class Array of 
> GenericData with zero entries and a dummy schema. My personal tests for 
> serialization with Kryo were successful when using it. Since I do not have 
> complete insight into Avro I'd like to know if this could be a breaking 
> change and how to test it if so.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to