0

我有以下案例类:

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 cannot be cast to 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

艾丽莎

4

2 回答 2

1

萨拉特开发商在这里。

看起来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提交票证

谢谢。

于 2015-05-12T15:59:41.903 回答
0

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

于 2016-11-25T13:24:22.847 回答