2017-08-30 54 views
1

我試圖在我們的軟件中使用C++ avro庫,並且遇到了重大障礙。我有一個「Value」類來包裝一系列類型,我想用avro來讀/寫它。這不僅包括簡單類型,而且包括類型,任意類和更多的std :: vectors。包含多個陣列的Avro工會

我想爲我的「Value」類指定一個avro模式。在我的例子中,我將它限制爲空,int,long,int整數和long數組。

我的模式是一個記錄,它有兩個字段,一個標識包含的類型和一個聯合來保存包含的對象。我有它的架構如下...

{ 
    "type": "record", 
    "name": "Value", 
    "fields": [ 
     { 
      "name": "ilk", 
      "type": "string" 
     }, 
     { 
      "name": "contents", 
      "type": [ 
       "null", 
       "boolean", 
       "int", 
       { 
        "type": "array", 
        "items": "int" 
       }, 
       "long", 
       { 
        "type": "array", 
        "items": "long" 
       } 
      ] 
     } 
    ] 
} 

我不指定JSON,但構建其打印出來,上面的Avro的C++模式層級。雖然驗證該架構層次結構失敗。通過C++代碼嗅探,即使數組或地圖中的類型不同,它也會阻止在聯合中有多個數組或地圖。

這實際上是否是avro標準的一部分,還是它在C++實現中的錯誤?我得到指定兩次相同的類型是一件愚蠢的事情,但我不會認爲具有不同包含類型的數組和地圖將被允許。

回答

0

在標準中找到我的答案。在聯合中不能有多個數組或映射。

聽起來有點跛腳,所以我不得不尋找一個骯髒的工作。

0

我其實並不認爲這是你想要的待辦事項。你想要的是創建一個具有不同類型的數組。喜歡這個。

{ 
    "namespace": "example.avro", 
    "type": "record", 
    "name": "Example", 
    "fields": [ 
    { 
     "name": "values", 
     "type": 
     { 
     "type": "array", 
     "items": ["int", "string"] 
     } 
    } 
    ] 
} 

這將創建一個可以有兩個簡單類型的數組。 「int」或「string」。你可以彈出任何複雜的類型。

+0

這不能與我們的內部類型系統一起工作,我通過將每個數組類型包裝在一個虛擬記錄中來解決這個問題。 – brunobignose