Java 在apacheavro中定义常量
如何在ApacheAvro中定义Java常量字段 范例Java 在apacheavro中定义常量,java,avro,Java,Avro,如何在ApacheAvro中定义Java常量字段 范例 public static final String FIELD = "field"; 简单的回答是:你没有。Avro是一个序列化系统;因此,为了理解为什么静态字段没有序列化,我们可以从Avro以外的角度来研究一般的序列化。以下是SO提供的一些资源 为了证明Avro不会序列化静态字段,我们可以使用ReflectData生成模式 import org.apache.avro.Schema; import org.apache.avr
public static final String FIELD = "field";
简单的回答是:你没有。Avro是一个序列化系统;因此,为了理解为什么静态字段没有序列化,我们可以从Avro以外的角度来研究一般的序列化。以下是SO提供的一些资源
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"}]}
上面的链接解释了为什么序列化静态字段是不必要和不受欢迎的,但我认为使用单个元素枚举也可以达到同样的效果。如果您看看,您将看到如何做到这一点。再看看这个@skizoozᴉ他不知道你在给我看什么。这是Avro API常量,不是如何在我的模式中定义常量。不是质疑Java如何在序列化中处理
静态值,而是指使用Avro作为类定义语言。你的答案在Avro的设计中是有意义的。我不完全确定你所说的类定义语言是什么意思,但我怀疑答案是Avro不是一种类定义语言。根据它的说法,ApacheAvro是一个数据序列化系统。话虽如此,看看如何将数据序列化系统用作类定义语言可能会很有趣;但是我怀疑你会进入一个未知的领域。类定义语言,这意味着我可以定义一个类结构,这样如果我有一个公共协议,那么第三方就可以使用我提供的“*.avsc”文件来处理他们使用的任何语言。我很惊讶Avro没有像Thrift那样提供一个恒定的定义。“用于可伸缩跨语言服务开发的软件框架将软件堆栈与代码生成引擎结合起来……”与Avro相比,我觉得这听起来像是苹果和桔子,但现在有一个流行的线程