Seeing the power of Scala, I wonder if an arbitrary object graph could be serialized and deserialized to/from XML using built-in Scala language features and libraries (e.g. without XMLEncoder, XStream or JAXB). Unfortunately, I haven't found such a solution. What could you advise?
5 回答
我不知道“是否可以使用内置的 Scala 语言功能和库对任意对象图进行序列化和反序列化到 XML 或从 XML 反序列化”,但由于 Scala 中有一些对 XML 的本机支持,所以我会提到它们。更多细节可以在 Ch 中找到。Programming in Scala 中的 26篇名为 Working with XML:
本章介绍 Scala 对 XML 的支持。在讨论了一般的半结构化数据之后,它展示了 Scala 中用于操作 XML 的基本功能:如何使用 XML 文字创建节点,如何将 XML 保存和加载到文件中,以及如何使用查询方法和模式匹配来拆分 XML 节点.
为了快速总结本章,我将引用一些关键点。
- Scala 包括对处理 XML 的特殊支持。
- Scala 允许您在表达式有效的任何地方输入 XML 作为文字。
- 您可以通过使用花括号 ({}) 作为转义来在 XML 文字中间评估 Scala 代码。
因此,您可以编写如下内容:
val foo = <a> {3 + 4} </a>
以上评估为scala.xml.Elem = <a> 7 </a>
。
- 如果要通过标签名称查找子元素,只需
\
使用标签名称调用即可。 \\
您可以使用而不是运算符进行“深度搜索”并查看子子元素等\
。
这本书有一个抽象类的序列化和反序列化的例子,但它是手写的:
abstract class CCTherm {
val description: String
val yearMade: Int
def toXML =
<cctherm>
<description>{description}</description>
<yearMade>{yearMade}</yearMade>
</cctherm>
def fromXML(node: scala.xml.Node): CCTherm =
new CCTherm {
val description = (node \ "description").text
val yearMade = (node \ "yearMade").text.toInt
}
}
更多信息可以在名为scala.xml的草稿书中找到。
afaik没有这样的事情。但你可能想看看sbinary
在包 net.liftweb.json, 对象 xml 中,我找到了以下函数:
def toXml(json: JValue): NodeSeq = {
def toXml(name: String, json: JValue): NodeSeq = json match {
case JObject(fields) => new XmlNode(name, fields flatMap { f => toXml(f.name, f.value) })
case JArray(xs) => xs flatMap { v => toXml(name, v) }
case JField(n, v) => new XmlNode(name, toXml(n, v))
case JInt(x) => new XmlElem(name, x.toString)
case JDouble(x) => new XmlElem(name, x.toString)
case JString(x) => new XmlElem(name, x)
case JBool(x) => new XmlElem(name, x.toString)
case JNull => new XmlElem(name, "null")
case JNothing => Text("")
}
json match {
case JField(n, v) => toXml(n, v)
case JObject(fields) => fields flatMap { f => toXml(f.name, f.value) }
case x => toXml("root", x)
}
}
有一个提取包,它具有将至少案例类转换为 JSON 的功能。与 toXml 一起,这可能会将许多数据类型转换为 XML。
就“建议”而言,我们一直在使用本地库来处理许多快速而肮脏的配置文件。主要优点是“解析”代码用于添加漂亮的错误消息。像这样:
val xml = xml.XML.load( source )
val required = ( xml \ "value" ).firstOption match {
case None => error( "The value element is missing, or should I be a default?" )
case Some( req ) => req
}
这是我通常使用 XStream 之类的东西的地方,所以它不是一个大开关。我不确定您是否可以使用库在反序列化框架上获得错误消息+默认处理。
Scala 的原生类库中没有任何内容。但是不乏能够做到这一点的 Java 库。