【问题标题】:SalatDAO deserialization of typed class with listSalatDAO 用列表反序列化类型化类
【发布时间】:2015-05-12 10:42:07
【问题描述】:

我有以下案例类:

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

艾丽莎

【问题讨论】:

    标签: mongodb casbah salat


    【解决方案1】:

    Salat 开发人员在这里。

    看起来Field[List[Network]] 一开始就没有正确序列化 - BasicDBList 是 mongo-java-driver 最后一次尝试序列化您的对象,将其视为一个元组,并作为BasicDBList 持久化。

    (如果您可以告诉 mongo-java-driver 在遇到不知道如何序列化的东西而不是将其转换为列表并推迟直到毫无戒心的用户尝试反序列化文档?)

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

    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

    谢谢。

    【讨论】:

    • 是什么让您认为 Field[String] 没有正确序列化?在数据库中的文档中,我有 "device_type" : { "value" : "mobile", "source" : "x1" } 所以它确实得到了正确的序列化。问题出在 Field[List[Network]]
    • 编辑的原始答案
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-03
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      相关资源
      最近更新 更多