2011-02-11 65 views
1

我正在尋找scala的xml序列化庫。 對JSON序列化我用電梯,JSON,並希望我的XML序列化庫是相似的,這意味着:Scala的哪個XML序列化庫?

  • case類(不帶任何格式定義)
  • 斯卡拉類型的智能序列化自動序列:集合,選項等
  • 爲其他數據類型定義格式以調整它們被序列化的方式的能力
  • 反序列化不是基於implicits而是基於類名(有時候我只有類/類名,它必須被反序列化)

你知道這樣的圖書館是否存在?

回答

4

嘗試scalaxb

+3

Scalaxb將xsd文件轉換爲scala類。但我有scala課程,想要序列化它們。 – 2011-02-11 11:37:39

4

一個偉大的選擇是使用純Java庫XStream

這適用於開箱即用的案例類,並進行了一些調整 - 我使用mixedbits-webframeworkXStreamConversions類,它也適用於List,Tuple,Symbol,ListBuffer和ArrayBuffer。所以這不是完美的,但你可以根據你的具體需求調整它。
這是一個小例子。

import com.thoughtworks.xstream.XStream 
    import com.thoughtworks.xstream.io.xml.StaxDriver 
    import net.mixedbits.tools.XStreamConversions 

    case class Bar(a:String) 
    case class Foo(a:String,b:Int,bar:Seq[Bar]) 

    object XStreamDemo { 
     def main(args: Array[String]) { 
      val xstream = XStreamConversions(new XStream(new StaxDriver())) 
      xstream.alias("foo", classOf[Foo]) 
      xstream.alias("bar", classOf[Bar]) 
      val f0 = Foo("foo", 1, List(Bar("bar1"),Bar("bar2"))) 

      val xml = xstream.toXML(f0) 
      println(xml) 

      val f1 = xstream.fromXML(xml) 
      println(f1) 
      println(f1 == f0) 
     } 
    } 

這將產生以下輸出:

<?xml version="1.0" ?><foo><a>foo</a><b>1</b><bar class="list"><bar><a>bar1</a></bar><bar><a>bar2</a></bar></bar></foo> 
    Foo(foo,1,List(Bar(bar1), Bar(bar2))) 
    true 

對於Java 1.6/2.9的Scala的依賴關係是xstream.jar文件和提及XStreamConversions類。

+1

這種方法的壞處是缺少對'Option []`的處理 – expert 2013-05-19 03:50:21