2013-03-26 9 views
6

ho voluto rappresentare una struttura ad albero standard nella parsimonia apache, ma ho incontrato seguente problema:parsimonia apache non riesce generando le strutture ricorsive

[ERROR:/path_to_project/thrift/service.thrift:31] (last token was 'TCategoryTree') 
Type "TCategoryTree" has not been defined. 

Queste sono le mie strutture di risparmio:

struct TCategory { 
    1: required string name 
} 

struct TCategoryTree { 
    1: required TCategory element, 
    2: optional list<TCategoryTree> children 
} 

Linea 31 è 2: optional list<TCategoryTree> children, dove definisco un campo che ha lo stesso tipo che sto definendo in questo momento.

Potrebbe essere che l'apache parsimonia non supporta le strutture ricorsive o sto facendo qualche tipo di errore qui?

edit: sto usando la versione 0.9.0

risposta

7

Sì, sfortunatamente Thrift non consente ancora strutture ricorsive. Esistono soluzioni alternative per questa limitazione, ad es. appiattisci le tue strutture dati mentre le trasmetti. Nella maggior parte dei casi questo è fattibile, anche se richiede un codice aggiuntivo su entrambi i lati.

Ecco un buon esempio di come farlo: http://grokbase.com/t/thrift/user/0984cqwxen/recursive-datatypes


Aggiornamento

L'attuale tronco sviluppo Thrift supporta questo per un po 'di tempo. Fai attenzione, poiché consente loop di riferimento infiniti (riferimenti A, riferimenti B A ...), con conseguente overflow dello stack durante il tentativo di serializzare.