使用Apache Avro的java.util.set字段序列化/反序列化

时间:2020-01-27 14:24:53

标签: java serialization deserialization avro

我正在尝试使用以下代码使用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字段?

1 个答案:

答案 0 :(得分:0)

通过将类型更改为HashSet而不是set来解决此问题。

引荐https://blog.51cto.com/shadowisper/1947979