2012-04-10 14 views
1

Ich verwende Xstream, um ein Objekt in Xml als Datei serialisieren. Das Objekt, das ich serialisieren möchte, ist sehr groß und besteht aus einer ziemlich komplizierten Baumstruktur. Dazu verwende ich den folgenden Code:Xstream serialisieren Heap-Speicherplatz

XStream xStream = new XStream(); 

    xStream.omitField(Stat.class, "sources"); 
    String XMLFilename = "XML-" + dateString + ".xml"; 

    FileOutputStream outputStream = null; 

    Writer writer = null; 

    try { 
     outputStream = new FileOutputStream(currentWorkPath+XMLFilename); 
     writer = new OutputStreamWriter(outputStream, Charset.forName("UTF-8")); 
     xStream.toXML(ss, writer); 

    } catch (Exception exp) { 
     log.error(null, exp); 
    } finally { 
     writer = null; 
     outputStream = null; 
    } 

Der Code funktioniert gut, aber ich aus Speicherfehler Java Heap-Speicher, wenn sehr große Objekte serialisiert. Gibt es einen Weg, dies zu verhindern? Ist es möglich, das XML im laufenden Betrieb zu erstellen, während das Objekt wächst?

Oder vielleicht eine andere XML-Serialisierungsbibliothek?

Ausnahme:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.HashMap.addEntry(Unknown Source) 
    at java.util.HashMap.put(Unknown Source) 
    at com.thoughtworks.xstream.core.util.ObjectIdDictionary.associateId(ObjectIdDictionary.java:91) 

Danke, James Ford

+0

Es sollte das Objekt schreiben, während es das zu serilisierende Objekt navigiert. Bei wiederholten Verweisen muss jedes Objekt in der Struktur aufgezeichnet werden, aber wenn Sie nicht über eine große Anzahl von Objekten verfügen, sollte dies nicht von Bedeutung sein. Ich vermute, die einfachste Sache, die Sie tun können, ist die maximale Größe des Heap zu erhöhen. –

+0

Wir brauchen ein Beispiel für das XML und die zugehörigen Java-Dateien ... – Kartoch

Antwort

0

Haben Sie Xpp3 Bibliothek auf Classpath (ex auf dem Server.)? XStream auf Java 5 und niedriger ohne Xpp3 (oder eine andere ähnliche Bibliothek) für den Klassenpfad verwendet den DOM-Treiber. Ohne irgendein Beispiel kann ich nur diesen Verdacht haben.