Apache Avro框架可以在序列化期间处理参数化类型吗?

Apache Avro可以在序列化期间处理参数化类型吗?

当我尝试序列化使用generics的实例时,我看到从Avro框架抛出此exception –

org.apache.avro.AvroTypeException: Unknown type: T at org.apache.avro.specific.SpecificData.createSchema(SpecificData.java:255) at org.apache.avro.reflect.ReflectData.createSchema(ReflectData.java:514) at org.apache.avro.reflect.ReflectData.createFieldSchema(ReflectData.java:593) at org.apache.avro.reflect.ReflectData$AllowNull.createFieldSchema(ReflectData.java:75) at org.apache.avro.reflect.ReflectData.createSchema(ReflectData.java:472) at org.apache.avro.specific.SpecificData.getSchema(SpecificData.java:189) 

我尝试序列化的类看起来像这样

 public class Property { private T propertyValue; } 

我正在尝试根据传入的POJO实例动态生成架构。 我的序列化代码如下所示 –

 ByteArrayOutputStream os = new ByteArrayOutputStream(); ReflectData reflectData = ReflectData.AllowNull.get(); Schema schema = reflectData.getSchema(propertyValue.getClass()); DatumWriter writer = new ReflectDatumWriter(schema); Encoder encoder = EncoderFactory.get().jsonEncoder(schema, os); writer.write(propertyValue, encoder); 

我的代码中触发exception的行:

 Schema schema = reflectData.getSchema(propertyValue.getClass()); 

相同的代码适用于没有参数化类型的类。

由于问题AVRO-1571, Avro版本1.7.7无法为参数化类型生成架构。 解决方法是明确指定参数化类型的模式,以便Avro不会尝试生成它:

 private static final String PROPERTY_STRING_SCHEMA = "{ " + "\"type\": \"record\", " + "\"name\": \"PropertyString\", " + "\"fields\": [" + "{ \"name\": \"propertyValue\", \"type\": \"string\" }" + "] " + "}"; @AvroSchema(PROPERTY_STRING_SCHEMA) private Property password;