2009-11-18 15 views
6

este código:¿Cómo puedo obtener XStream para que muestre correctamente las listas de Scala? ¿Puedo escribir un convertidor personalizado?

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

Respuesta

2
No

segundos después de la publicación de la pregunta, la respuesta vino a mí, aquí es una implementación funcional de unmarshal:

def unmarshal(reader: HierarchicalStreamReader, context: UnmarshallingContext) = { 
    var list : List[_] = Nil 
    while (reader.hasMoreChildren()) { 
     reader.moveDown(); 
     val item = readItem(reader, context, list); 
     list = list ::: List(item) // be sure to build the list in the same order 
     reader.moveUp(); 
    } 
    list 
    } 
1

No es sólo una instancia de una lista vacía, que es el objeto Nil.

+0

¿Podría dar más detalles? No veo la relevancia de su respuesta a la pregunta –

+0

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. –

+0

¡Tiene perfecto sentido ahora que lo explicas, gracias! –

Cuestiones relacionadas