2016-08-31 39 views
1

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

public static final String FIELD = "field"; 
+0

如果你看一下[documentation](https://avro.apache.org/docs/1.7.7/api/java/constant-values.html),你會看到如何去做。也請看看這個[文檔](https://avro.apache.org/docs/1.6.0/api/java/constant-values.html) –

+0

@ Skizo-ozᴉʞS不知道你給我看的是什麼。這是Avro API常量,而不是如何在我的模式中定義一個常量。 – bdparrish

回答

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"}]} 

的鏈接解釋爲什麼序列化靜態字段是不必要的,不可取的,但我想你可以實現與單相同的效果元素枚舉。

+0

不質疑Java如何處理序列化中的'static'值,而是參考將Avro用作類定義語言。你的答案從Avro的設計中是有意義的。 – bdparrish

+0

我不完全確定_a類定義language_的意思,但我懷疑答案是Avro不是定義語言的類。根據它的[主頁](https://avro.apache.org/)_Apache Avro是一個數據序列化系統。也就是說,看看數據序列化系統如何被用作類定義語言;但我懷疑你會進入未知領域。 – jaco0646

+0

類定義語言,這意味着我可以定義一個類結構,所以如果我有一個公共協議,那麼第三方可以利用我提供的'* .avsc'文件來處理他們正在使用的任何語言。我很驚訝Avro沒有像Thrift那樣提供一個恆定的定義。 – bdparrish