Сериализация Avro Enum в Java - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь сериализовать значение enum в сообщение Avro и отправить его. Схема построена с:

Schema myschema = SchemaBuilder.record("com.testing.schemas").fields()
.name("enumTest").type().nullable().enumeration("aname")
.symbols("a","b","c","d","e").noDefault();

и выглядит следующим образом

{"name":"enumTest","type":
[{"type":"enum","name":"aname",
"symbols":"a","b","c","d","e"]}
,"null"]}

Мой код:

GenericRecord record = new GenericData.Record(myschema);
GenericData.EnumSymbol symbol = new GenericData.EnumSymbol(
myschema.getField("enumTest").schema(), "a");
record.put("enumTest", symbol);

При попытке отправить сообщение я получаю сообщение об ошибке :

Error serializing Avro message
org.apache.avro.UnresolvedUnionException: Not in union [{"type":"enum","name":"aname","namespace":"com.testing.schemas","symbols":["a","b","c","d","e"]},"null"]: a

Чего мне не хватает? Спасибо.

1 Ответ

0 голосов
/ 23 апреля 2020

Тип поля aname - это Union, а не Enum:

[ {
  "type" : "enum",
  "name" : "aname",
  "namespace" : "com.testing",
  "symbols" : [ "a", "b", "c", "d", "e" ]
}, "null" ]

Вы можете сделать что-то вроде этого:

    String namespace = "com.testing";

    Schema enumTest =
        SchemaBuilder.enumeration("aname")
            .namespace(namespace)
            .symbols("a", "b", "c", "d", "e");

    Schema myschema =
        SchemaBuilder.record("schemas")
            .namespace(namespace)
            .fields()
            .name("enumTest")
            .type()
            .unionOf()
            .nullType()
            .and()
            .type(enumTest)
            .endUnion()
            .noDefault()
            .endRecord();

    GenericRecord record = new GenericData.Record(myschema);
    GenericData.EnumSymbol symbol = new GenericData.EnumSymbol(enumTest, "a");
    record.put("enumTest", symbol);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...