Avro:ReflectDatumWriter 不输出架构信息

Avro: ReflectDatumWriter does not output schema information

参见下面的示例代码:

        User datum = new User("a123456", "my.email@world.com");
        Schema schema = ReflectData.get().getSchema(datum.getClass());
        DatumWriter<Object> writer = new ReflectDatumWriter<>(schema);
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        Encoder encoder = EncoderFactory.get().binaryEncoder(output, null);
        writer.write(datum, encoder);
        encoder.flush();
        byte[] bytes = output.toByteArray();
        System.out.println(new String(bytes));

产生:

a123456$my.email@world.com

我原以为所有 Avro 作者都会发布架构信息和数据,但事实并非如此。

如果我将 GenericDatumWriterDataFileWriter 结合使用,我可以成功打印模式,但我希望使用 ReflectDatumWriter,因为我不想构建GenericRecord 我自己(我希望图书馆这样做)

如何同时序列化架构?

我自己解决了这个问题,您需要使用 DataFileWriter 因为它包含写入模式的 create() 方法中的一个条目

解决方案是将其与 ByteArrayOutputStream:

结合使用
        Schema schema = ReflectData.get().getSchema(User.class);
        DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(schema);
        DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<GenericRecord>(datumWriter);
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        dataFileWriter.create(schema, output);
        GenericRecord user = createGenericRecord(schema);
        dataFileWriter.append(user);
        dataFileWriter.close();
        byte[] bytes = output.toByteArray();
        System.out.println(new String(bytes));