2015-02-23 63 views
2

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

我看到这个异常从Avro的框架抛出,当我试图序列使用泛型实例 -

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<T> { 

    private T propertyValue; 

} 

我想基于传入的POJO实例即时生成模式。我的序列化代码看起来是这样的 -

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

线在我的代码触发异常:

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

相同的代码工作正常,没有参数化类型的类。

回答

2

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

private static final String PROPERTY_STRING_SCHEMA = 
    "{ " + 
     "\"type\": \"record\", " + 
     "\"name\": \"PropertyString\", " + 
     "\"fields\": [" + 
     "{ \"name\": \"propertyValue\", \"type\": \"string\" }" + 
     "] " + 
    "}"; 

@AvroSchema(PROPERTY_STRING_SCHEMA) 
private Property<String> password; 
相关问题