在 Apache Avro 中定义常量

Define constants in Apache Avro

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

示例

public static final String FIELD = "field";

简短的回答是:你不知道。 Avro 是一个序列化系统;所以要理解为什么静态字段没有序列化,我们可以超越 Avro,看看一般的序列化。这里有一些来自 SO 的资源。

  • How to serialize static data members of a Java class?
  • Java static serialization rules?

为了证明 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"}]}

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