SalatDAO带有列表的类型类的反序列化

时间:2015-05-12 10:42:08

标签: mongodb casbah salat

我有以下案例类:

case class Network(val name : String, val mac : String)
case class Field[T](var value : T, var source : String = "")
case class Device(var _id : ObjectId = new ObjectId,
                  var device_type : Field[String] = Field[String](""),
                  var networks : Field[List[Network]] = new Field[List[Network]](List[Network]())) {
  def hasMac(mac : String) : Boolean = {
    networks.value.foreach { n => if(n.mac == mac) return true }
    return false
  }
}

我能够序列化/反序列化Device的实例。 但是,在反序列化之后,hasMac方法崩溃并出现异常: “ClassCastException:com.mongodb.BasicDBList无法强制转换为scala.collection.immutable.List”

如此定义Device类

case class Device(var _id : ObjectId = new ObjectId,
                  var device_type : Field[String] = Field[String](""),
                  var networks : List[Network] = List[Network]()) {
  def hasMac(mac : String) : Boolean = {
    networks.foreach { n => if(n.mac == mac) return true }
    return false
  }
}

我没有收到错误,一切都按预期工作。

我看到salat不支持Option [List],但这里我有Field [List]。 我无法从这个页面了解salat是否支持这种类型: https://github.com/novus/salat/wiki/SupportedTypes

Aliza

2 个答案:

答案 0 :(得分:1)

Salat开发人员。

看起来Field[List[Network]]首先没有正确序列化 - BasicDBList是mongo-java-driver的最后一次尝试序列化您的对象,将其视为一个元组获取坚持为BasicDBList

(并且如果你能告诉mongo-java-driver只是在遇到它不知道如何序列化而不是将其转换为a列出并推迟问题直到毫无戒心的用户尝试反序列化文档?)

这是一个测试,显示一个参数化的案例类,其中包含一个参数化为相同类型的列表。

https://github.com/novus/salat/blob/master/salat-core/src/test/scala/com/novus/salat/test/SortedSeqSpec.scala#L44-L49

但是,我无法找到任何证明参数化为List[Foo[X]]的案例类可用的规范。

请在机票上报到 https://github.com/novus/salat/issues

感谢。

答案 1 :(得分:0)

我也面临着同样的问题。我工作了将近一个星期。但最后解决方案是让我发笑。我只是将所有案例类主实体,子实体放在单个文件中。从技术上讲,我不知道它是如何解决的。但我喜欢分享我的经验。