2012-10-08 18 views
9

Necesito almacenar la clase Scala en Morphia. Con anotaciones funciona bien a menos que trato de colección tienda de _ <: EnumeraciónScala, Morphia y Enumeration

Morphia se queja de que no tiene serializadores para ese tipo, y me pregunto, cómo proporcionar una. Por ahora cambié el tipo de colección a Seq [String], y lo llené con la invocación toString en cada artículo en la colección.

Eso funciona bien, pero no estoy seguro de que sea así.

+1

¿Qué quiere decir exactamente con "una colección de' _ <: Enumeration' "? ¿Quiere decir un 'Seq [_ <: Enumeration]' (que es lo mismo que un 'Seq [Enumeration]', a menos que 'Seq' sea mutable), o quiere decir algo más? –

+1

Es Seq de ** A extends Enumeration ** – jdevelop

+0

¿Ha intentado usar 'A.Value' en lugar de' A.type'? ¿O estoy malinterpretando el propósito del 'Seq'? –

Respuesta

1

Este problema es común a varias capas de abstracción disponibles en la parte superior de MongoDB. Todo vuelve a una razón básica: no hay equivalente enum en json/bson. Salat por ejemplo tiene el mismo problema.

De hecho, controlador MongoDB Java no soporta enumeraciones como se puede leer en la discusión pasa aquí: https://jira.mongodb.org/browse/JAVA-268, donde se puede ver el problema todavía está abierta. La mayoría de los marcos que he visto para usar MongoDB con Java no implementan funcionalidades de bajo nivel como este. Creo que esta elección tiene mucho sentido porque te dejan la opción de cómo manejar las estructuras de datos que no maneja el controlador de bajo nivel, en lugar de imponerte cómo hacerlo.

En general, creo que la falta de soporte no proviene de una limitación técnica sino de una elección de diseño. Para las enumeraciones, hay múltiples formas de mapearlas con sus pros y sus contras, mientras que para otros tipos de datos es probablemente más simple. No conozco el controlador MongoDB Java en detalle, pero supongo que admitir varios "modos" habría requerido alguna refactorización (¿quizás es por eso que están hablando de una nueva versión de serialización?)

Estas son dos estrategias que yo soy pensando:

  • Si quiere crear un índice en una enumeración y minimizar la ocupación de espacio, tendrá un mapa de la enumeración a un entero (no se utiliza el ordinal, por favor can set enum start value in java).
  • Si su preocupación es queryability en el mongoshell, ya que sus datos serán accesibles por el científico de datos, se prefiere almacenar la enumeración utilizando su valor de cadena

Para concluir, no hay nada malo en la adición de un intermedio de datos estructura entre su objeto nativo y MongoDB. Salat lo admite a través de CustomTransformers, en Morphia quizás deba hacer la conversión explícitamente. Ve a por ello.