【问题标题】:Why are static and transient members not fetch in Avro InduceSchemaTool from Java classes?为什么在 Avro InduceSchemaTool 中不能从 Java 类中获取静态和瞬态成员?
【发布时间】:2014-11-26 23:05:27
【问题描述】:

我正在尝试从 Java 类层次结构创建一个 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 生成架构的一部分。

【问题讨论】:

    标签: java reflection schema avro


    【解决方案1】:

    从我在 Apache Avro 主页上可以看到:“Apache Avro™ 是一个数据序列化系统。”。

    现在,让我们打开 JLS 8.3.1.3。瞬态字段:“变量可能被标记为瞬态,以表明它们不是对象持久状态的一部分。”

    静力学也是如此。

    ReflectData 源代码声明如下:“返回此类及其超类以进行序列化。”

    因此,答案是:它们不是对象持久状态的一部分,因此没有必要将这些字段包含在架构中(从工具的角度来看)。

    【讨论】:

    • 感谢@Ivan 的解释。我现在明白,由于瞬态和静态不是对象持久状态的一部分,因此工具会跳过它们。我没有理解:ReflectData 源代码声明如下:“返回此类及其超类以进行序列化。”
    • 当它说 Return of this class 我明白这意味着所有成员。该语句是否固有地指定要以某种方式跳过 Transient 和 Static ?
    • 我认为从序列化角度来看重要的所有字段。
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多