在Apache Avro中定义常量

时间:2016-08-31 16:07:51

标签: java avro

如何在Apache Avro中定义Java常量字段?

实施例

public static final String FIELD = "field";

1 个答案:

答案 0 :(得分:2)

简短的回答是:你不是。 Avro是一个序列化系统;因此,为了理解为什么静态字段没有被序列化,我们可以超越Avro,一般来说是序列化。以下是来自SO的一些资源。

为了证明Avro没有序列化静态字段,我们可以使用ReflectData来生成架构。

import org.apache.avro.Schema;
import org.apache.avro.reflect.ReflectData;

public class Main {
    public static void main(String... args) {
        Schema schema = ReflectData.get().getSchema(Main.Foo.class);
        System.out.println(schema);
    }

    static class Foo {
        public static final String FIELD = "field";
    }
}

输出为:{"type":"record","name":"Foo","namespace":"thepackage.Main$","fields":[]}
注意空数组的字段。

如果字段上没有static修饰符,则架构变为:

{"type":"record","name":"Foo","namespace":"thepackage.Main$","fields":[{"name":"FIELD","type":"string"}]}

上面的链接解释了为什么序列化静态字段是不必要的和不合需要的,但我想你可以用单元素枚举实现相同的效果。