Scala のパワーを見て、組み込みの Scala 言語機能とライブラリを使用して (たとえば、XMLEncoder、XStream、または JAXB を使用せずに)、任意のオブジェクト グラフを XML との間でシリアライズおよびデシリアライズできるのではないかと思います。残念ながら、そのような解決策は見つかりませんでした。何をアドバイスできますか?
5 に答える
「組み込みのScala言語機能とライブラリを使用して任意のオブジェクトグラフをXMLとの間でシリアル化および逆シリアル化できるかどうか」はわかりませんが、ScalaにはXMLのネイティブサポートがあるため、それらについて説明します。詳細については、Ch。XMLの操作と呼ばれるScalaでのプログラミングの26 :
この章では、ScalaによるXMLのサポートを紹介します。半構造化データ全般について説明した後、XMLを操作するためのScalaの基本的な機能、つまり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と呼ばれるドラフトブックでより多くの情報を見つけることができます。
そのようなことはありません。しかし、あなたは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 に変換する機能を持つ Extraction パッケージがあります。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 ライブラリが不足することはありません。