Zeichenbegrenzung bei xstream

Status
Nicht offen für weitere Antworten.

Milo

Bekanntes Mitglied
Hallo,

ich verwende XStream, um ein selbstdefiniertes Objekt zu speichern, das funktioniert auch wunderbar. Probleme habe ich nun beim wieder einlesen des Files bzw. beim erzeugen des Objektes. Ich erhalte die Fehlermeldung, dass bestimmte Tags nicht geschlossen werden bspw.

com.thoughtworks.xstream.converters.ConversionException: : end tag name </do> must match start tag name <double-array> from line 1684 (position: TEXT seen ...</double>\n

Wie hier zu sehen, ist der Endtag </double-array>, jedoch wird leider nicht alles gelesen. Ich lese die Datei in einen String ein und gebe diese dann an mein XStream-Objekt. Den String habe ich bereits auf vollständigkeit geprüft in getJag3DStorage()- er ist okay. Gibt es beim XStream-Objekt eine Zeichenbegrenzung?

Sofern es wichtig ist, hier meine Readerklasse. Ich lese aus einem ZIP-File die darin gepackte Datei direkt in ein StringBuffer (extractData()-Methode). Beim Wandeln in mein Objekt in getJag3DStorage() bekomme ich eine Exception (Auszug siehe unten).

Meine Frage: gibt es eine Zeichenbegrenzung oder wo liegt mein Fehler? Kleiner Datenmengen gehen problemlos.

Code:
package com.derletztekick.geodesy.jag3d.io;

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
//import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

import com.derletztekick.geodesy.jag3d.Jag3DDataManager;
import com.derletztekick.geodesy.jag3d.storage.Jag3DStorage;
import com.thoughtworks.xstream.XStream;

/**
 * Klasse, die ein Projekt bzw. eine Projektdatei einlesen kann 
 *
 */
public class ProjectReader {
	private static final byte[] buffer = new byte[ 0xFFFF ];
	private XStream xstream = new XStream();
	private StringBuffer xml = new StringBuffer();
	private boolean isComplete = false;
    public ProjectReader(String projectFileName) throws ZipException, IOException {
    	this.isComplete = this.extractData( projectFileName );
    }
    
    /** 
     * Liefer <code>true</code>, wenn das lLesen erfolgreich war
     * @return isComplete
     */
    public boolean isComplete() {
    	return this.isComplete;
    }
   
    /**
     * Liefert aus der gelesenen Datei das Jag3DProject
     * @return storage
     */
    public Jag3DStorage getJag3DStorage() {
    	try {
    		return (Jag3DStorage) xstream.fromXML( this.xml.toString() );
    	}catch (Exception err) {
    		err.printStackTrace();
    	}
    	return null;
    }
    
    /**
     * Liest das Projektfile in einen StringBuffer ein und gibt im Erfolgsfall <code>true</code> zurueck
     * @param projectFileName
     * @return isComplete
     */
    private boolean extractData(String projectFileName) {
    	boolean isComplete = false;
    	ZipFile projectFile = null;
    	try {
    		projectFile = new ZipFile( projectFileName );
        } catch ( FileNotFoundException e ) {
            System.err.println( "ZipFile not found error!" );
        } catch ( IOException e ) {
            System.err.println( "unzip/IO error!" );
        }
        
    	if (projectFile != null)  {
    		this.xml = new StringBuffer();
    		//for ( Enumeration<? extends ZipEntry> e = projectFile.entries(); e.hasMoreElements(); ) {
    		//	ZipEntry entry = e.nextElement();
    		//}
    		ZipEntry entry = projectFile.getEntry( Jag3DDataManager.PROJECT_FILE_NAME );
    		if (entry != null) {
                if (!entry.isDirectory()) {
                	InputStream  is = null;
                	OutputStream os = null;
                	//System.out.println( entry.getName() );
                	try {
                		is = projectFile.getInputStream( entry );
                		os = new ByteArrayOutputStream();
                		
                		for ( int len; (len = is.read(buffer)) != -1; ) {
                			os.write(buffer,0,len);
                			this.xml.append( os.toString() ).append("\r\n");
                			//System.out.println( os.toString() );
                		}
                		isComplete = true;
                	} catch( IOException err) {
                		err.printStackTrace();
                	}
                	finally {
                		if (os != null)
                			try {
                				os.close();
                			} catch( IOException err) {
                				err.printStackTrace();
                			}
                		if (is != null)
                			try {
                				is.close();
                			} catch( IOException err) {
                				err.printStackTrace();
                			}
                	}
                	
                }
    		}
            
    		try {
                projectFile.close();
            } catch( IOException err) {
                err.printStackTrace();
            }
        }
    	return isComplete;
    }
    
}

Hier die Fehlermeldung
Code:
com.thoughtworks.xstream.converters.ConversionException:  : end tag name </do> must match start tag name <double-array> from line 1684 (position: TEXT seen ...</double>\n                  </do\r... @1686:24)  :  : end tag name </do> must match start tag name <double-array> from line 1684 (position: TEXT seen ...</double>\n                  </do\r... @1686:24) 
---- Debugging information ----
message             :  : end tag name </do> must match start tag name <double-array> from line 1684 (position: TEXT seen ...</double>\n                  </do\r... @1686:24) 
cause-exception     : com.thoughtworks.xstream.io.StreamException
cause-message       :  : end tag name </do> must match start tag name <double-array> from line 1684 (position: TEXT seen ...</double>\n                  </do\r... @1686:24) 
class               : com.derletztekick.geodesy.jag3d.storage.Jag3DStorage
required-type       : [D
path                : /com.derletztekick.geodesy.jag3d.storage.Jag3DStorage/storage/com.derletztekick.geodesy.jag3d.storage.Jag3DStorageDataElement[3]/observationGroup/observations/com.derletztekick.geodesy.lsa.observation.Zenithangle[2]/stochasticParameters/obsR/elements/double-array
line number         : 1686
-------------------------------

Danke Micha
 

Milo

Bekanntes Mitglied
Hallo,

war mein Fehler beim Einlesen. Mit folgendem Code gehts dann:

Code:
int readBytes;
   	          while (is.available() > 0) {
   	        	  readBytes = is.read(buffer);
   	        	  xml.append(new String(buffer, 0, readBytes));
   	          }

Gruß Micha
 

HoaX

Top Contributor
Code:
for ( int len; (len = is.read(buffer)) != -1; ) {
    os.write(buffer,0,len);
    this.xml.append( os.toString() ).append("\r\n");
    //System.out.println( os.toString() );
}

is klar, so kann es sein dass du mitten in einen tag einen zeilenumbruch einfügst.

ich würde außerdem einen InputStreamReader verwenden und diesen direkt an XStream weitergeben anstatt selbst erstmal alles zu puffern. so kannst du auch das charset angeben um encoding-probleme zu unterbinden.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JTextArea & Zeichenbegrenzung Java Basics - Anfänger-Themen 4

Ähnliche Java Themen


Oben