让我们来创建一个简单的类。使用AvroCoder序列化提供的模式的泛型类
class IntValue {
private int data;
IntValue() {}
IntValue(int data) { this.setData(data); }
int getData() { return this.data; }
void setData(int data) { this.data = data; }
}
和薄通用包装:
class Snapshot<T> {
private T value;
Snapshot<T>() {}
T getValue() { return value; }
void setValue(T value) { this.value = value; }
}
接下来让我们做一个帮手来获得包装的架构。
private static Schema buildSnapshotSchema(Schema valueSchema) {
return SchemaBuilder.record("Snapshot")
.namespace("com.stackoverflow.primer")
.fields()
.name("value").type(valueSchema).noDefault()
.endRecord();
}
最后,我想以同样的方式与明确的模式创建AvroCoder因为它是在Using Avrocoder for Custom Types with Generics
AvroCoder.of(Snapshot.class, buildSnapshotSchema(AvroCoder.of(IntValue.class).getSchema())
结果产生...
Exception in thread "main" java.lang.IllegalArgumentException: Unable to get field data from class null
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.getField(AvroCoder.java:710)
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.checkRecord(AvroCoder.java:548)
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.doCheck(AvroCoder.java:477)
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.recurse(AvroCoder.java:453)
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.checkRecord(AvroCoder.java:567)
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.doCheck(AvroCoder.java:477)
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.recurse(AvroCoder.java:453)
at com.google.cloud.dataflow.sdk.coders.AvroCoder$AvroDeterminismChecker.check(AvroCoder.java:430)
at com.google.cloud.dataflow.sdk.coders.AvroCoder.<init>(AvroCoder.java:189)
at com.google.cloud.dataflow.sdk.coders.AvroCoder.of(AvroCoder.java:144)
at com.stackoverflow.primer.GenericPipeline.main(GenericPipeline.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
它发生在AvroDeterminismChecker中,当它无法从Object的实例获取字段“数据”时。这是有道理的,但为什么它不使用提供的模式来重建对象?在这种情况下如何创建AvroCoder的实例?
UPDATE
找到另一篇文章中有类似的问题,但它看起来就像是无法得到解决...... Dataflow output parameterized type to avro file
你可以请发布完整的堆栈跟踪,而不是只有错误消息? – jkff
@jkff只是FYI SDK的版本是1.9.0 – Eugene
@jkff我已经用完整的堆栈跟踪更新了这篇文章,能否再次检查一下? – Eugene