println(new XStream.toXML(List(1,2,3)))
produce este XML:
<scala.coloncolon serialization="custom">
<unserializable-parents/>
<scala.coloncolon>
<int>1</int>
<int>2</int>
<int>3</int>
<scala.ListSerializeEnd/>
</scala.coloncolon>
</scala.coloncolon>
lugar me gustaría esto:
<list>
<int>1</int>
<int>2</int>
<int>3</int>
</list>
que sería similar a la forma en las colecciones de Java genéricos obtener serializado. ¿Cuál es la mejor manera de hacer esto?
que tengo la mayor parte del camino mediante la implementación de mi propio convertidor, pero estoy atascado en el método unmarshal, no está claro cómo crear una instancia de una lista vacía ...
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))
}
}
¿Podría dar más detalles? No veo la relevancia de su respuesta a la pregunta –
Ha preguntado cómo podría crear una lista vacía. Solo digo que solo hay una lista vacía, que es 'Nil'. Por lo tanto, debe referirse a eso, como lo hizo en el código que ha mostrado en su respuesta. –
¡Tiene perfecto sentido ahora que lo explicas, gracias! –