2017-05-04 24 views
0

請參見下面的示例代碼:Avro公司:ReflectDatumWriter不輸出模式信息

 User datum = new User("a123456", "[email protected]"); 
     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)); 

主要生產:

[email protected] 

我認爲,所有的Avro作家將出版模式信息以及與數據,但這不是。

我可以成功,如果我在組合使用GenericDatumWriterDataFileWriter獲取模式打印,但我希望用ReflectDatumWriter,因爲我不希望建立一個GenericRecord自己(我希望庫做到這一點)

我該如何獲得架構序列化呢?

回答

0

我這解決了我自己,你需要使用一個DataFileWriter,因爲這包含在寫入模式

解決辦法是連同ByteArrayOutputStream用這個create()方法的條目:

 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));