Frage XStream - Unmarshalling - Typ angegeben in XML nicht sichtbar


Ich habe einige XML-Dateien von XStream vor einer Weile gespeichert, und sie enthalten Verweise auf RandomAccessSubList, eine Klasse, die nicht über die Paketebene sichtbar ist und keinen Standardkonstruktor hat, so dass XStream diesen Fehler auslöst:

com.thoughtworks.xstream.converters.ConversionException: Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor : Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor

---- Debugging information ----
message             : Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor
cause-exception     : com.thoughtworks.xstream.converters.reflection.ObjectAccessException
cause-message       : Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor*

und das ist das XML:

<customTimes class="java.util.RandomAccessSubList">
  <l class="list">
    <long>1302174300146</long>
    <long>1302174305231</long>
    <long>1302174310312</long>

etc.

Ich kann nicht einfach einen Konverter für RandomAccessSubList schreiben, da er außerhalb des util-Pakets nicht sichtbar ist. Wie kann ich XStream mitteilen, dass es die Klasse für dieses Attribut ignorieren soll oder wie kann ich einen Konverter für eine Klasse angeben, die ich nicht referenzieren kann?

Danke im Voraus!


5
2017-11-01 12:59


Ursprung


Antworten:


Ich bin auf den Grund davon gekommen - stellt sich heraus, Xstream sollte diese XML behandeln (es benötigt keinen No-Args-Konstruktor), das Problem entstand, weil ich jdk 7 mit einer älteren Version von Xstream (1.3.1) verwendet wurde. Siehe hier http://code.google.com/p/pitestrunner/issues/detail?id=4. Zurück zu jdk 6 behob das Problem (aus verschiedenen Gründen kann ich nicht upgraden).

Bevor ich erkannte, dass ich einen Konverter geschrieben habe, der für RandomAccessSubList funktioniert, wenn jemand es benötigt:

public class RandomAccessSubListConverter extends CollectionConverter {

public RandomAccessSubListConverter(Mapper mapper) {
    super(mapper); 
} 

@Override
public boolean canConvert(Class arg0) {     
    return arg0.getName().equals("java.util.RandomAccessSubList");
}

@Override
public Object unmarshal(HierarchicalStreamReader reader,
        UnmarshallingContext context) {        
    reader.moveDown();
    ArrayList arrayList = new ArrayList();
    populateCollection(reader, context, arrayList);
    reader.moveUp();
    return arrayList;
}

Danke an alle, die nach mir gesucht haben!


8
2017-11-02 11:53