- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在为一个来自 Rails 的新项目学习 Scala。我已经定义了一个将在我的许多模型中使用的类型,它基本上可以被认为是“属性”的集合。它基本上只是一个 hashmap 的包装器,将其大部分职责委托(delegate)给它:
case class Description(attributes: Map[String, String]) {
override def hashCode: Int = attributes.hashCode
override def equals(other: Any) = other match {
case that: Description => this.attributes == that.attributes
case _ => false
}
}
然后我会用Description
定义一个模型类,比如:
case class Person(val name: String, val description: Description)
但是,当我将 Person
与 SalatDAO 持久化时,我最终得到的文档如下所示:
{
name : "Russell",
description:
{
attributes:
{
hair: "brown",
favourite_color: "blue"
}
}
}
实际上我不需要在 description
标签中嵌套 attributes
标签——我真正想要的是:
{
name : "Russell",
description:
{
hair: "brown",
favourite_color: "blue"
}
}
我没试过,但我想如果我让 Description
扩展一个 Map
而不是包含一个,我想我可以让它工作,但我宁愿不,因为 Description
不是 Map
的一种,它具有 Map
的某些行为以及它自己的我稍后会添加。组合优于继承等等。
所以我的问题是,我如何告诉 Salat(或 Casbah,实际上我有点不清楚是哪个在进行转换,因为我才刚刚开始使用它们)如何序列化和反序列化 说明
类?在casbah教程中here它说:
It is also possible to create your own custom type serializers and deserializers. See Custom Serializers and Deserializers.
但是这个页面好像不存在。还是我走错了路?实际上是否有一种非常简单的方法来表明这是我想要发生的事情,注释或其他什么?或者我可以简单地将序列化以某种方式委托(delegate)给属性映射吗?
编辑:在查看了 JodaTime 转换助手的源代码后,我尝试了以下方法,但还没有成功:
import org.bson.{ BSON, Transformer }
import com.mongodb.casbah.commons.conversions.MongoConversionHelper
object RegisterCustomConversionHelpers extends Serializers
with Deserializers {
def apply() = {
super.register()
}
}
trait Serializers extends MongoConversionHelper
with DescriptionSerializer {
override def register() = {
super.register()
}
override def unregister() = {
super.unregister()
}
}
trait Deserializers extends MongoConversionHelper {
override def register() = {
super.register()
}
override def unregister() = {
super.unregister()
}
}
trait DescriptionSerializer extends MongoConversionHelper {
private val transformer = new Transformer {
def transform(o: AnyRef): AnyRef = o match {
case d: Description => d.attributes.asInstanceOf[AnyRef]
case _ => o
}
}
override def register() = {
BSON.addEncodingHook(classOf[Description], transformer)
super.register()
}
}
当我调用 RegisterCustomConversionHelpers()
然后保存一个 Person
时,我没有收到任何错误,它只是没有效果,保存文档的方式与以往相同。为了我想要的,这似乎还有很多事情要做。
最佳答案
Salat 维护者在这里。
我不明白 Description 在这里作为包装器的值(value)。它包装了一个属性映射,覆盖了一个 case 类的默认 equals 和 hashcode impl——这似乎是不必要的,因为无论如何 impl 被委托(delegate)给了映射,而这正是 case 类所做的——并引入了一个额外的间接层序列化对象。
您是否考虑过:
case class Person(val name: String, val description: Map[String, String])
这将完全满足您的需求。
在另一种情况下,我会推荐一个简单的类型别名,但不幸的是,Salat 目前无法支持类型别名,因为它们在 pickled Scala 签名中的描述方式存在一些问题。
(您可能出于简洁的考虑从您的示例中省略了这一点,但是您的 Mongo 模型最好有一个 _id 字段 - 如果您没有,Mongo Java 驱动程序将为您提供一个)
salat-core 测试包中有一个自定义 BSON Hook 的工作示例(它处理 java.net.URL)。可能是因为您没有在正确的位置注册它,所以您的钩子(Hook)无法正常工作?但是,我仍然建议去掉 Description,除非它添加了一些在上面的示例中不明显的值。
关于scala - 使用 Casbah/Salat 定义自定义序列化 - 或者将序列化委托(delegate)给成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9531846/
好的,所以我编辑了以下... 只需将以下内容放入我的 custom.css #rt-utility .rt-block {CODE HERE} 但是当我尝试改变... 与 #rt-sideslid
在表格 View 中,我有一个自定义单元格(在界面生成器中高度为 500)。在该单元格中,我有一个 Collection View ,我按 (10,10,10,10) 固定到边缘。但是在 tablev
对于我的无能,我很抱歉,但总的来说,我对 Cocoa、Swift 和面向对象编程还很陌生。我的主要来源是《Cocoa Programming for OS X》(第 5 版),以及 Apple 的充满
我正在使用 meta-tegra 为我的 NVIDIA Jetson Nano 构建自定义图像。我需要 PyTorch,但没有它的配方。我在设备上构建了 PyTorch,并将其打包到设备上的轮子中。现
在 jquery 中使用 $.POST 和 $.GET 时,有没有办法将自定义变量添加到 URL 并发送它们?我尝试了以下方法: $.ajax({type:"POST", url:"file.php?
Traefik 已经默认实现了很多中间件,可以满足大部分我们日常的需求,但是在实际工作中,用户仍然还是有自定义中间件的需求,为解决这个问题,官方推出了一个 Traefik Pilot[1] 的功
我想让我的 CustomTextInputLayout 将 Widget.MaterialComponents.TextInputLayout.OutlinedBox 作为默认样式,无需在 XML 中
我在 ~/.emacs 中有以下自定义函数: (defun xi-rgrep (term) (grep-compute-defaults) (interactive "sSearch Te
我有下表: 考虑到每个月的权重,我的目标是在 5 个月内分散 10,000 个单位。与 10,000 相邻的行是我最好的尝试(我在这上面花了几个小时)。黄色是我所追求的。 我试图用来计算的逻辑如下:计
我的表单中有一个字段,它是文件类型。当用户点击保存图标时,我想自然地将文件上传到服务器并将文件名保存在数据库中。我尝试通过回显文件名来测试它,但它似乎不起作用。另外,如何将文件名添加到数据库中?是在模
我有一个 python 脚本来发送电子邮件,它工作得很好,但问题是当我检查我的电子邮件收件箱时。 我希望该用户名是自定义用户名,而不是整个电子邮件地址。 最佳答案 发件人地址应该使用的格式是: You
我想减小 ggcorrplot 中标记的大小,并减少文本和绘图之间的空间。 library(ggcorrplot) data(mtcars) corr <- round(cor(mtcars), 1)
GTK+ noob 问题在这里: 是否可以自定义 GtkFileChooserButton 或 GtkFileChooserDialog 以删除“位置”部分(左侧)和顶部的“位置”输入框? 我实际上要
我正在尝试在主页上使用 ajax 在 magento 中使用 ajax 显示流行的产品列表,我可以为 5 或“N”个产品执行此操作,但我想要的是将分页工具栏与结果集一起添加. 这是我添加的以显示流行产
我正在尝试使用 PasswordResetForm 内置函数。 由于我想要自定义表单字段,因此我编写了自己的表单: class FpasswordForm(PasswordResetForm):
据我了解,新的 Angular 7 提供了拖放功能。我搜索了有关 DnD 的 Tree 组件,但没有找到与树相关的内容。 我在 Stackblitz 上找到的一个工作示例.对比drag'ndrop功能
我必须开发一个自定义选项卡控件并决定使用 WPF/XAML 创建它,因为我无论如何都打算学习它。完成后应该是这样的: 到目前为止,我取得了很好的进展,但还有两个问题: 只有第一个/最后一个标签项应该有
我要定制xtable用于导出到 LaTeX。我知道有些问题是关于 xtable在这里,但我找不到我要找的具体东西。 以下是我的表的外观示例: my.table <- data.frame(Specif
用ejs在这里显示日期 它给我结果 Tue Feb 02 2016 16:02:24 GMT+0530 (IST) 但是我需要表现为 19th January, 2016 如何在ejs中执行此操作?
我想问在 JavaFX 中使用自定义对象制作 ListView 的最佳方法,我想要一个每个项目如下所示的列表: 我搜了一下,发现大部分人都是用细胞工厂的方法来做的。有没有其他办法?例如使用客户 fxm
我是一名优秀的程序员,十分优秀!