在 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"}]}
上面的链接解释了为什么序列化静态字段是不必要和不可取的,但我想您可以使用单元素枚举实现相同的效果。
如何在 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"}]}
上面的链接解释了为什么序列化静态字段是不必要和不可取的,但我想您可以使用单元素枚举实现相同的效果。