我正在尝试从Java Class层次结构创建一个avro架构。 在我深入研究完整结构之前,我试图为一个简单的java类生成一个Avro模式,如下所示
package TestAvroTools;
import java.util.ArrayList;
public class InduceSchemaIPClass {
private int inta;
private String stringb;
private ArrayList<String> a = null;
private boolean booleana;
private static class InnerKlass{
int innerKlassInta;
}
}
Avro InduceScehmaTool(org.apache.avro.tool)(avro v1.7.7)(jdk 1.6)跳过静态类成员InnerKclass。 输出如下:
{
"type" : "record",
"name" : "InduceSchemaIPClass",
"namespace" : "test.avro.ip",
"fields" : [ {
"name" : "inta",
"type" : "int"
}, {
"name" : "stringb",
"type" : "string"
}, {
"name" : "a",
"type" : {
"type" : "array",
"items" : "string",
"java-class" : "java.util.ArrayList"
}
}, {
"name" : "booleana",
"type" : "boolean"
} ]
}
我调试了代码以找到在ReflectData的getFields()(org.apache.avro.reflect)中跳过此内容的语句
for (Field field : c.getDeclaredFields())
if ((field.getModifiers() & (Modifier.TRANSIENT|Modifier.STATIC)) == 0)
有没有理由这么做?我需要静态成员作为Avro生成模式的一部分。
答案 0 :(得分:0)
从我在Apache Avro主页上看到的内容:“Apache Avro™是一个数据序列化系统。”。
现在,让我们打开JLS 8.3.1.3。 transient字段:“变量可能标记为瞬态,表示它们不属于对象的持久状态。”
静态的故事。
ReflectData源代码声明如下:“返回此类及其超类序列化。”
所以,答案是:它们不是对象持久状态的一部分,因此没有必要在模式中包含这些字段(从工具的角度来看)。