このコード:
println(new XStream.toXML(List(1,2,3)))
このXMLを生成します:
<scala.coloncolon serialization="custom">
<unserializable-parents/>
<scala.coloncolon>
<int>1</int>
<int>2</int>
<int>3</int>
<scala.ListSerializeEnd/>
</scala.coloncolon>
</scala.coloncolon>
代わりに私はこれが欲しいです:
<list>
<int>1</int>
<int>2</int>
<int>3</int>
</list>
これは、汎用Javaコレクションがシリアル化される方法と似ています。これを行うための最良の方法は何ですか?
私は自分のコンバーターを実装することでほとんどの方法を手に入れましたが、アンマーシャルメソッドに固執しています。空のリストをインスタンス化する方法が明確ではありません...
class ListConverter( _mapper : Mapper ) extends AbstractCollectionConverter(_mapper) {
/** Helper method to use x.getClass
*
* See: http://scalide.blogspot.com/2009/06/getanyclass-tip.html
*/
def getAnyClass(x: Any) = x.asInstanceOf[AnyRef].getClass
def canConvert( clazz: Class[_]) = {
classOf[::[_]] == clazz
}
def marshal( value: Any, writer: HierarchicalStreamWriter, context: MarshallingContext) = {
val list = value.asInstanceOf[List[_]]
for ( item <- list ) {
writeItem(item, context, writer)
}
}
def unmarshal( reader: HierarchicalStreamReader, context: UnmarshallingContext ) = {
println(context.getRequiredType())
var list : List[_] = createCollection(context.getRequiredType()).asInstanceOf[List[_]]
while (reader.hasMoreChildren()) {
reader.moveDown();
val item = readItem(reader, context, list);
list = item :: list
reader.moveUp();
}
list
}
}
object ListConverter {
def configureXStream( stream: XStream ) = {
stream.alias("list", classOf[::[_]])
stream.registerConverter( new ListConverter(stream.getMapper) )
}
}