2012-10-08 78 views
9

我需要在Morphia存儲Scala類。使用註釋它工作得很好,除非我嘗試存儲收集的_ <:枚舉Scala,Morphia和枚舉

嗎啡抱怨說,它沒有序列化該類型的,我想知道,如何提供一個。現在我將收集類型更改爲Seq [String],並在集合中的每個項目上調用toString

這很好,但我不確定這是否正確。

+1

「_ _:Enumeration」的集合究竟是什麼意思?你的意思是一個'Seq [_ <:Enumeration]'(它與Seq [Enumeration]'相同,除非Seq'是可變的),還是你的意思是別的? –

+1

它是**的次序擴展枚舉** – jdevelop

+0

您是否嘗試過使用'A.Value'而不是'A.type'?或者我誤解了「Seq」的目的? –

回答

1

這個問題在MongoDB頂層的幾個可用抽象層中很常見。這一切都回到了一個基本原因:在json/bson中沒有相當於enum的枚舉。 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上,也許你需要明確地進行轉換。去吧。