【问题标题】:Scala, Morphia and EnumerationScala、Morphia 和枚举
【发布时间】:2013-08-04 16:28:03
【问题描述】:

我需要在 Morphia 中存储 Scala 类。除非我尝试存储 _ <: enumeration>

的集合,否则使用注释它工作得很好

Morphia 抱怨它没有该类型的序列化程序,我想知道如何提供。现在我将集合类型更改为 Seq[String],并在集合中的每个项目上调用 toString 来填充它。

效果很好,但我不确定这是否正确。

【问题讨论】:

  • _ &lt;: Enumeration 的集合”到底是什么意思?您是指Seq[_ &lt;: Enumeration](与Seq[Enumeration] 相同,除非Seq 是可变的),还是其他意思?
  • 它是 A 的 Seq 扩展枚举
  • 你试过用A.Value代替A.type吗?还是我误解了Seq 的目的?
  • 是的。 Morphia 不知道如何序列化枚举。

标签: scala enums morphia


【解决方案1】:

这个问题在 MongoDB 之上的几个可用抽象层中很常见。这一切都回到了一个基本原因:在 json/bson 中没有等效的枚举。 Salat 例如有同样的问题。

事实上,MongoDB Java 驱动程序不支持枚举,您可以在此处的讨论中阅读:https://jira.mongodb.org/browse/JAVA-268 您可以看到问题仍然存在。我见过的大多数使用 MongoDB 和 Java 的框架都没有实现像这个这样的低级功能。我认为这个选择很有意义,因为它们让您选择如何处理未由低级驱动程序处理的数据结构,而不是强加给您如何处理。

总的来说,我觉得缺乏支持不是来自技术限制,而是来自设计选择。对于枚举,有多种方法可以将它们与其优缺点进行映射,而对于其他数据类型可能更简单。我不详细了解 MongoDB Java 驱动程序,但我想支持多种“模式”需要一些重构(也许这就是他们谈论新版本的序列化的原因?)

这是我正在考虑的两种策略:

  • 如果你想对一个枚举进行索引并最小化空间占用,你会将枚举映射到一个整数(不使用序数,请can set enum start value in java)。
  • 如果您担心 mongoshell 上的可查询性,因为您的数据将被数据科学家访问,您宁愿使用其字符串值存储枚举

总而言之,在原生对象和 MongoDB 之间添加中间数据结构并没有错。 Salat 通过 CustomTransformers 支持它,在 Morphia 上,您可能需要明确地进行转换。去吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多