Scala 的哪个 XML 序列化库?

发布于 2024-10-17 02:38:59 字数 256 浏览 2 评论 0原文

我正在寻找 scala 的 xml 序列化库。 对于 json 序列化,我使用 lift-json,并且希望我的 xml 序列化库类似,这意味着:

  • 案例类的自动序列化(没有任何格式定义)
  • scala 类型的智能序列化:集合、选项等
  • 定义格式的能力其他数据类型来调整它们的序列化方式反
  • 序列化不是基于隐式而是基于类名(有时我只有必须反序列化的类型的类/类名)

您知道这样的库是否存在吗?

I'm looking for xml serialization library for scala.
For json serialization I use lift-json, and would like my xml serialization library to be similar, that means:

  • automatic serialization of case classes (without any format definition)
  • smart serialization of scala types: collections, options etc.
  • ability to define formats for other datatypes to adjust a way they are serialized
  • deserialization not based on implicits but rather on class name (sometimes I have only class/class name of type which must be deserialized)

Do you know if such library exists?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

风月客 2024-10-24 02:38:59

一种很好的选择是使用纯 Java 库 XStream

这适用于开箱即用的案例类,需要进行一些调整 - 我正在使用类 XStreamConversions 来自 mixedbits-webframework - 它也适用于 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 / Scala 2.9,依赖项是 xstream.jar 文件和提到的 XStreamConversions 类。

One great alternative is to use the pure Java library XStream.

This works with case classes out of the box, with some tweaking - I'm using the class XStreamConversions from mixedbits-webframework -, it also works with List, Tuple, Symbol, ListBuffer and ArrayBuffer. So it's not perfect, but you can surely fine tune it for your specific needs.
Here is a small example.

    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)
      }
    }

This produces the following output:

    <?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

For Java 1.6 / Scala 2.9 the dependencies are the xstream.jar file and the mentioned XStreamConversions class.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文