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

SalatDAO deserialization of typed class with list

我有以下情况classes:

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
  }
}

我能够 serialize/deserialze 个设备实例。 然而,在反序列化之后,hasMac 方法异常崩溃: "ClassCastException: com.mongodb.BasicDBList cannot be cast to scala.collection.immutable.List"

当设备class这样定义时

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

艾丽莎

在这里向开发人员致敬。

看起来 Field[List[Network]] 一开始就没有正确序列化 - BasicDBList 是 mongo-java-驱动程序最后一次尝试序列化你的对象它作为一个元组被持久化为 BasicDBList.

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

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

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

但是,我找不到任何规范来证明参数化为 List[Foo[X]] 的案例 class 会起作用。

请在 https://github.com/novus/salat/issues

谢谢。

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