2013-12-20 72 views
0

我使用XStream我在斯卡拉的应用程序有以下薄的包装:在不使用asInstanceOf的情况下从Scala中的XStream反序列化XML?

import com.thoughtworks.xstream._ 

object SXStream { 
    private val xstream = new XStream 

    def fromXML[T](xml: String): T = { 
    xstream.fromXML(xml).asInstanceOf[T] 
    } 

    def toXML[T](obj: T): String = { 
    xstream.toXML(obj) 
    } 
} 

这是我要得到最好的,或者是有没有asInstanceOf周围的方法吗?看起来像cast是Java中的推荐用法;我想知道如果斯卡拉提供了一些更清洁的选项。

+0

当我尝试使用此错误时,出现'com.thoughtworks.xstream.mapper.CannotResolveClassException'错误?... – dividebyzero

回答

2

可以避开asInstanceOf,但优势是有限的 - 代码变得更地道,你可以使ClassCastException更具体:

def any(xml: String): Any = xml 
def fromXML[T: ClassTag](xml: String): T = any(xml) match { 
    case a: T => a 
    case other => throw new RuntimeException("Invalid type " + other.getClass + " found during marshalling of xml " + xml) 
} 

在另一方面,这是更详细的,可能少高效率地致电asInstanceOf

+2

应使用'ClassTag'或'TypeTag'来代替'Manifest'。从Scala 2.10开始已经被弃用了。 –

+0

感谢您的建议。我做了这个改变。 – yakshaver

+0

@yakshaver从何时可以匹配模式匹配中的类型'T'。不输入删除完全打败你试图做的事情? – wheaties

相关问题