Dieser Code:
println(new XStream.toXML(List(1,2,3)))
erzeugt dieses XML:
<scala.coloncolon serialization="custom">
<unserializable-parents/>
<scala.coloncolon>
<int>1</int>
<int>2</int>
<int>3</int>
<scala.ListSerializeEnd/>
</scala.coloncolon>
</scala.coloncolon>
Stattdessen möchte ich dies:
<list>
<int>1</int>
<int>2</int>
<int>3</int>
</list>
Das wäre ähnlich, wie die generischen Java-Sammlungen serialisiert werden. Was ist der beste Weg, dies zu tun?
Ich habe die meisten der Weg dorthin durch die Implementierung meiner eigenen Konverter, aber ich bin auf die unmarshal-Methode stecken, seine nicht klar, wie eine leere Liste zu instanziieren...
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) )
}
}