我正在尝试使用以下代码使用Apache Avro序列化具有java.util.set字段的自定义对象:
final Schema schemaItemImportSchema = ReflectData.get().getSchema(clazz);
final DatumWriter<T> writer = new ReflectDatumWriter<>(clazz);
byte[] data = new byte[0];
final ByteArrayOutputStream stream = new ByteArrayOutputStream();
try {
final Encoder encoder = EncoderFactory.get().jsonEncoder(schema, stream);
datumWriter.write(data, encoder);
encoder.flush();
data = stream.toByteArray();
} catch (final Exception excp) {
log.error(excp);
}
然后使用以下代码进行反序列化
final Schema schemaItemImportSchema = ReflectData.get().getSchema(clazz);
final DatumReader<T> reader = new ReflectDatumReader<>(clazz);
Object dataActual = new Object();
try {
final Decoder decoder = DecoderFactory.get().jsonDecoder(schema, new String(data));
dataActual = reader.read(null, decoder);
} catch (final IOException excp) {
log.error(excp);
}
使用上述代码,我可以使用设置字段成功进行序列化,但是在反序列化过程中出现以下错误,
java.lang.RuntimeException: java.lang.NoSuchMethodException: java.util.Set.<init>()
如果我将@AvroIgnore用于设置字段,则序列化和反序列化都可以完美地工作。
如何序列化和反序列化java.util.set字段?