2012-10-08 4 views
9

Ho bisogno di memorizzare la classe Scala in Morphia. Con annotazioni funziona bene a meno che non cerco di memorizzare collezione di _ <: EnumerationScala, morfina ed enumerazione

Morphia si lamenta che non ha serializzatori per quel tipo, e mi chiedo, come fornire uno. Per ora ho cambiato il tipo di collezione in Seq [String] e lo ho compilato invocando toString su ogni articolo in collezione.

Funziona bene, tuttavia non sono sicuro che sia corretto.

+1

Cosa intendete esattamente con "una raccolta di' _ <: Enumerazione' "? Intendi un 'Seq [_

+1

È il seq di ** A Estende Enumerazione ** – jdevelop

+0

Hai provato a usare "A.Value' invece di' A.type'? O sto interpretando erroneamente lo scopo del 'Seq'? –

risposta

1

Questo problema è comune a diversi livelli di astrazione disponibili nella parte superiore di MongoDB. Tutto torna ad una ragione di fondo: non esiste enum equivalente in json/bson. Salat ad esempio ha lo stesso problema.

Infatti, conducente MongoDB Java non supporta le enumerazioni come si può leggere nella discussione succedendo qui: https://jira.mongodb.org/browse/JAVA-268 dove si può vedere il problema è ancora aperto. La maggior parte dei framework che ho visto usare MongoDB con Java non implementano funzionalità di basso livello come questa. Penso che questa scelta abbia molto senso perché ti lascia la scelta su come gestire le strutture dati non gestite dal driver di basso livello, invece di imporvi come farlo.

In generale, ritengo che l'assenza di supporto non derivi dalla limitazione tecnica, ma piuttosto dalla scelta del design. Per le enumerazioni, ci sono molti modi per mapparle con i loro pro e i loro contro, mentre per altri tipi di dati è probabilmente più semplice. Non conosco il driver MongoDB Java in dettaglio, ma suppongo che il supporto di più "modalità" avrebbe richiesto un refactoring (forse è per questo che stanno parlando di una nuova versione di serializzazione?)

Queste sono due strategie che sto pensando:

  • Se si desidera indicizzare su un enum e ridurre al minimo l'occupazione di spazio, si mappare l'enumerazione in un numero intero (se non utilizzano l'ordinale, si prega di can set enum start value in java).
  • Se la vostra preoccupazione è queryability sul mongoshell, perché i vostri dati saranno accessibili da scienziato dei dati, si preferisce memorizzare l'enum utilizzando il suo valore stringa

Per concludere, non c'è nulla di male ad aggiungere un dato intermedio struttura tra il tuo oggetto nativo e MongoDB. Salat supportarlo tramite CustomTransformers, su Morphia forse avresti bisogno di fare la conversione esplicitamente. Fallo.