println(new XStream.toXML(List(1,2,3)))
produziert diese 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 würde ich dies mag:
<list>
<int>1</int>
<int>2</int>
<int>3</int>
</list>
, die ähnlich sein würde, wie die generische Java-Sammlungen serialisiert bekommen. Was ist der beste Weg, dies zu tun?
Ich habe die meisten der Weg dorthin bekam von meinem eigenen Konverter Umsetzung, aber ich bin fest auf der Abstellungsmethode, es ist nicht klar, wie eine leere Liste instanziiert ...
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))
}
}
Könnten Sie näher ausführen? Ich sehe nicht die Relevanz Ihrer Antwort auf die Frage –
Sie fragte, wie Sie eine leere Liste instanziieren können. Ich sage nur, dass es nur eine leere Liste gibt, die "Nil" ist. Sie müssen sich also darauf beziehen - wie Sie es in dem Code getan haben, den Sie in Ihrer Antwort gezeigt haben. –
Macht vollkommen Sinn jetzt, dass Sie es erklären, thx! –