Deserialisation funktioniert nicht

Status
Nicht offen für weitere Antworten.

little_b

Mitglied
Hallöchen,

Ich habe ein Problem beim deserialisieren über das Netzwerk.

ich habe eine Client - Server Anwendung geschrieben die über HTTPS kommuniziert.
Als Client verwende ich den HttpClient von Jakarta Commons.

Das Handshake funktioniert und ich habe eine Funktion implementiert die String[ ] in
beide Richtungen via PostMethod übertragen kann.
Nun möchte ich aber vom Server eine Struktur übertragen.
genauer :
ein bestimmtes Verzeichnis vom Server wird ausgelesen. Jedes File wird in
ein MetaFile geschrieben und diese MetaFiles werden in eine Liste geschrieben.

Diese Struktur(Liste und Ihre objekte) sollen nun durch serialisierung übertragen
werden. Die Klassen implementieren serialiszable.
Client und Server haben beide den gleichen java compiler.
Den kompletten Server code habe ich zum testen erstmal in ein jar verpackt
und der client benutzt dieses um auf die serializable funktionen zuzugreifen.

Problem:
Sobald ich auf die Struktur zugreife erhalte ich eine null pointer exception.


einpacken (server code)
Code:
... // bekommt das Object mappedFileList
    
        m_response.setContentType("application/octet-stream");
        
        ObjectOutputStream objOut;
        try {
            objOut = new ObjectOutputStream(
                    new BufferedOutputStream(
                            m_response.getOutputStream()));
            
            objOut.writeObject(mappedFileList);
            objOut.close();

auspacken (client code)

Code:
       ObjectInputStream objIn = null;
        MappedFileList serverWorkspace = null;
        try {
            objIn = new ObjectInputStream(
                    new BufferedInputStream(
                            post.getResponseBodyAsStream()));
            
            serverWorkspace = (MappedFileList) objIn.readObject();


zugriff auf das object (client) :

Code:
 // liefert die
 MappedFileList mappedServerList = resData.getServerWorkspace(postMethod);
  Iterator it = mappedServerList.getList().iterator();

Durch den Zugriff des Iterators auf das erste element ensteht folgender Fehler :
Code:
Exception occurred during event dispatching:
java.lang.NullPointerException
	at de.controller.ConnectController.handleRequest(ConnectController.java:155)
	at de.controller.MainController.handleEvent(MainController.java:132)
	at de.controller.MainController.handleEvent(MainController.java:128)

Der Fehler tritt auch auf wenn ich direkt auf das erste element zugreife
MappedFile file = (MappedFile)mappedServerList.getList().get(0);

Der debugger öffnet mir in der Liste keine Elemente. Leider kenne ich mit
Serialisierung nicht aus.

Bin dankbar für jede Hilfe :)

Bastian
 
S

SlaterB

Gast
poste den Code deiner Klasse MappedFile und MappedFileList ,
möglichst stark vereinfacht,
z.B. nur eine Exemplarvariable int in MappedFile, nur eine Exemplarvariable MappedFile in der Liste,

poste ein vollständiges Testprogramm mit main,
in welchem du ein Objekt erstellst, in den Stream schreibst, direkt wieder ausliest und der Fehler erscheint,

oder hast du das schon getestet und bei Out/ InStream direkt hintereinander klappts?
 

little_b

Mitglied
ich habe auf dem server folgenden funktionsfähigen Code ausprobiert.

Die objecte mappedFile werden in die 'List' MappedFileList geschrieben.

Dann in ein File serialisiert, sofort wieder deserialisiert und ausgegeben.

also auf dem server funktioniert folgendes :

Code:
       // serialisieren
       File file = new File("muh");
        try {
            ObjectOutputStream oos = new ObjectOutputStream(
                    new BufferedOutputStream(
                            new FileOutputStream(file)));
            
            oos.writeObject(mappedFileList);
            oos.close();
            
            // gleich wieder deserialisieren
            ObjectInputStream ois = new ObjectInputStream(
                    new BufferedInputStream(
                            new FileInputStream("muh")));
            MappedFileList obj = (MappedFileList)ois.readObject();
            
            // testen
            Iterator it = obj.getMappedFileList().iterator();
            while (it.hasNext()) {
                MappedFile test = (MappedFile)it.next();
                System.out.println("name " + test.getName());
            }

wenn ich aber nun aber nach dem serialisieren das file manuel
(ohne netzwerk, also mit der Hand :) ) auf den client kopiere
und dort den code zum deserialisieren anwende

Code:
   private void testDeserialize() {

        ObjectInputStream ois;
        try {
            ois = new ObjectInputStream(
                    new BufferedInputStream(
                            new FileInputStream("/home/testlab/muh")));
            
            MappedFileList obj = (MappedFileList)ois.readObject();            
            Iterator it = obj.getMappedFileList().iterator();
            
            while (it.hasNext()) {
                MappedFile test = (MappedFile)it.next();
                System.out.println("name " + test.getName());
            }
            
        } catch // ... exception handling
    }

Passsiert genau der gleiche fehler. An der Stelle
--> obj.getMappedFileList().iterator();
liefert obj.getMappedFileList() 'null' und somit ist der Iterator null usw.

Ich vermute der client hat Probleme den Inhalt in die Struktur zu initialisieren.
Aber warum?

Ich habe nochmal MappedFile und MappedFileList vom Server vereinfacht angehängt :
Code:
import java.io.Serializable;

public final class MappedFile implements Serializable {

    /**
     * serialVersionUID = 3638996933322808483L;
     */
    private static final long serialVersionUID = 3638996933322808483L;

    /** filename with suffix. */
    private final String m_name;
    
// some more members

    /** 
     * Contructor creates immutable object.
     * 
     * @param name Smb file name.
     * @param path Smb file path.
     * @param size Smb file size.
     * @param date Smb file date.
     * @param isFile true for file and false for directory.
     */
    public MappedFile(
            String name,
            String path,
            long size,
            long date,
            boolean isFile) {
        
        m_name   = name;
        m_path   = path;
        m_size   = size;
        m_date   = date;
        m_isFile = isFile;
    }

    /**
     * 
     * @return mapped file name.
     */
    public String getName() {
        return m_name;
    }

  // some more getter
}

und

Code:
public class MappedFileList implements Serializable {

    /**
     * serialVersionUID = -3060314338397543617L;
     */
    private static final long serialVersionUID = -3060314338397543617L;
    
    /** mapped file objects */
    private List m_mappedFiles;
    
    /**
     * Constructor.
     */
    public MappedFileList() {
        m_mappedFiles = new ArrayList();
    }
        
    /**
     * @return list of mapped files.
     */
    public List getList() {
        return m_mappedFiles;
    }
}

Die liste wird in einer anderen Klasse durch den Constructor initialisiert und
anschliessend befüllt.
Vielleicht muss ich ja die Klasse, die die Liste füllt, auch serializeable machen ?
Erklärt mir aber nicht warum es auf dem Server funktioniert und auf dem
Client nicht ?


bastian
 
S

SlaterB

Gast
dann bleibt noch zu testen, ob auf dem Client das serialisieren + deserialisieren direkt hintereinander geht,

wenn das geht, dann vergleiche mal die beiden Dokumente:
auf Server serialisiert + auf Client serialisiert

(im Texteditor oder als byte[] einlesen)

unterscheiden sich nur einzelne Buchstaben/ bytes?
irgendein Encoding-Fehler?
oder sind die Dateien stark unterschiedlich?

wie siehts bei leeren Listen aus?

--------

dass auf beiden Seien die Klassen die gleichen sein müssen,
versteht sich von selbst, auch möglichst gleich kompiliert (behaupte ich mal im Trüben fischend)
kannst du von einer Seite die .class-Dateien kopieren und verwenden?

hilft der Einsatz von einer serialVersionUID in jeder Klasse?
private static final long serialVersionUID = 42L;
http://java.sun.com/j2se/1.5.0/docs/api/java/io/Serializable.html
 

little_b

Mitglied
habe es jetzt auch geschaft das file auf dem server zu deserialisieren.
Ich habe nochmal alles gelöscht und mit ants neu gebaut jetzt gehts ?!
muss eine Anhängikeit falsch gewesen sein.

Leider muss mein Programm java 1.4.2 kompatibel sein.

Mit den streams über das Netzwerk geht es leider noch nicht :

Code:
2006-11-30 14:16:17,716 DEBUG [AWT-EventQueue-0] httpclient.wire.header: << "Date: Thu, 30 Nov 2006 13:16:15 GMT[\r][\n]"

java.io.EOFException

2006-11-30 14:16:17,716 DEBUG [AWT-EventQueue-0] httpclient.wire.header: << "Server: Apache/2.2.2 (Fedora) mod_ssl/2.2.2OpenSSL/0.9.8a DAV/2 PHP/5.1.6 SVN/1.3.2 mod_jk/1.2.15 mod_fastcgi/mod_fastcgi-SNAP-0404142202[\r][\n]"

	at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2165)
	at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2631)
	at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:734)
...

EOFException verstehe ich nicht, habe hier kein file?


erstmal vielen dank für die hilfe :)

bastian
 

little_b

Mitglied
sry ich meinte natürlich den client und nicht den server.

also ein file das ich auf dem server erstellt habe und
manuel übertrage lässt sich nun auch deserialisieren.
 
G

Guest

Gast
Schliesse das Stream serverseitig nicht.

Es sollte wie folgt ablaufen

Server
Code:
ObjectOutputStream out = new ObjectOutputStream(
   new BufferedOutputStream(
      response.getOutputStream()
   )
);
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("application/octet-stream");
out.writeObject(wasauchimmer);
out.flush();
Client
Code:
ObjectInputStream in = new ObjectInputStream(
   new BufferedInputStream(
      connection.getInputStream()
   )
);
Object result = in.readObject();
in.close();
 

little_b

Mitglied
super :)

Für 1600 Files funktioniert es jetzt. Ich glaube es war das flush() was mir gefehlt hat.
Wenn das Object zu gross wird tritt aber immer noch ein Fehler auf.

server log :
Code:
ClientAbortException:  java.io.IOException
        at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:366)
        at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:433)

der client übertragt das object über HTTP und bricht dann nach einiger Zeit mit folgender exception ab

client log :
Code:
2006-12-01 10:41:17,997 DEBUG [AWT-EventQueue-0] 
    org.apache.commons.httpclient.HttpMethodBase: Should NOT close connection, using HTTP/1.1
2006-12-01 10:41:17,997 DEBUG [AWT-EventQueue-0]
     org.apache.commons.httpclient.HttpConnection: Releasing connection back to connection manager.

Exception occurred during event dispatching:
java.lang.NullPointerException
	at de.bredex.bxsync.controller.ConnectController.handleRequest(ConnectController.java:157)
	at de.bredex.bxsync.controller.MainController.handleEvent(MainController.java:132)
	at de.bredex.bxsync.controller.MainController.handleEvent(MainController.java:128)


der server überträgt folgende Fehlerseite an den Client :

Code:
2006-12-01 10:41:17,991 DEBUG [AWT-EventQueue-0] httpclient.wire.content: << "    The server is temporarily unable to service your[\n]"
2006-12-01 10:41:17,991 DEBUG [AWT-EventQueue-0] httpclient.wire.content: << "    request due to maintenance downtime or capacity[\n]"
2006-12-01 10:41:17,991 DEBUG [AWT-EventQueue-0] httpclient.wire.content: << "    problems. Please try again later. [\n]"

Irgendwas bricht die übertragung ab.

Ist der Buffer in den ich schreibe beliebig gross?
 
G

Guest

Gast
little_b hat gesagt.:
Ist der Buffer in den ich schreibe beliebig gross?
Jajn. Das Problem ist eher die Zeit, die es braucht, bis es gesendet wird.
Schreibe am besten in einer Schleife jeweils eine Datei und immer die Länge als long
davor
Code:
for(int i=0; i<files.length(); i++)
{
   out.writeLong(files[i].length()); // oder von mir aus auch noch den Dateinamen hinteher o.ä.
   writeFile(out, files[i]); // eine Methode, die eine einzelne Datei schreibt
   out.flush();
}
out.writeLong(-1L); // Ende der Übertragung.
out.flush();

// und kein out.close() serverseitig.
Ich gehe mal davon aus dass es sehr viele kleine Dateien sind.
Sowas wie eine komplette Webseite mit Grafik etc.
Was wird's, wenn es fertig ist? :)
 

little_b

Mitglied
Es wird ein Synchronisationsprogram. Das zu übertragene
Objekt ist eine Liste die eine Verzeichnisstruktur enthält.
Ich werde mal versuchen anstelle der Liste die Objekte
einzeln zu übertragen. Hoffe das dauert bei 40.000 Objekten
nicht all zu lange :)

Nochmal vielen Dank
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G WSDL-Aufruf funktioniert nicht mehr nach Umstieg auf Maven Allgemeine Java-Themen 4
Zrebna Berechnung der Zeit funktioniert nicht wie erwartet: Date, GregorianCalendar Allgemeine Java-Themen 16
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
M Apache Proxy Weiterleitung auf Tomcat funktioniert nicht wie gewünscht Allgemeine Java-Themen 1
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
stormyark TikTakToe funktioniert nicht Allgemeine Java-Themen 10
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
P String.replace() funktioniert nicht? Allgemeine Java-Themen 3
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
N Regulärer Ausdruck funktioniert nicht Allgemeine Java-Themen 6
Lukas2904 Wie funktioniert ein KeyLogger? Allgemeine Java-Themen 3
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
1Raini Java if-Abfrage funktioniert nicht! Allgemeine Java-Themen 3
Killunox MaxHeap Zuweisung unter Linux funktioniert nicht Allgemeine Java-Themen 1
I Wieso funktioniert das nich? Allgemeine Java-Themen 5
Dann07 MP3 Datei abspielen funktioniert nicht Allgemeine Java-Themen 6
O Aus JAR-Datei erstellte EXE-Datei funktioniert nicht Allgemeine Java-Themen 10
A Mp3 Player funktioniert nicht Allgemeine Java-Themen 0
X JNA funktioniert nicht mehr Allgemeine Java-Themen 4
bueseb84 FolderWatcher mit WatchService funktioniert nur bedingt Allgemeine Java-Themen 5
Drachenbauer Division mit Int funktioniert nicht Allgemeine Java-Themen 3
O docx-Datei erzeugung mit DocXStamper funktioniert nicht Allgemeine Java-Themen 2
F Schleife funktioniert nicht richtig Allgemeine Java-Themen 13
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Tesseract-OCR 4.0 unter Linux funktioniert nicht Allgemeine Java-Themen 3
J Wie konkret funktioniert das Modulsystem unter Java 11? Allgemeine Java-Themen 4
J Neuronales Netz funktioniert mal und mal nicht. Allgemeine Java-Themen 3
T Umlaute in Eclipse einlesen funktioniert nicht Allgemeine Java-Themen 16
A Methodenaufruf funktioniert nicht richtig Allgemeine Java-Themen 5
C WindowBuilder Design funktioniert nicht Allgemeine Java-Themen 0
J FTPSClient funktioniert nicht Allgemeine Java-Themen 4
H IDEA IntelliJ Java Mail funktioniert nach Export nicht mehr! Allgemeine Java-Themen 1
M Operatoren Warum funktioniert diese überprüfung nicht? Allgemeine Java-Themen 7
R jar-Datei funktioniert nicht Allgemeine Java-Themen 2
E Open Declaration Funktioniert nicht Allgemeine Java-Themen 0
R Verschlüsselung funktioniert nicht Allgemeine Java-Themen 5
RalleYTN requires transitive funktioniert nicht? Allgemeine Java-Themen 7
R Bruteforce hashes mit multithreading. Funktioniert das so? Allgemeine Java-Themen 0
P Best Practice Wieso funktioniert der Modulo - Operator nicht? Allgemeine Java-Themen 2
HarleyDavidson Eigener PropertyChangeListener funktioniert einfach nicht Allgemeine Java-Themen 3
J Exclude funktioniert nicht Allgemeine Java-Themen 2
K .jar funktioniert nicht vollständig Allgemeine Java-Themen 1
P Java https proxy (-Dhttps.proxyHost) Start-Parameter funktioniert nicht? Allgemeine Java-Themen 2
L Auswertung eines Testes funktioniert nicht Allgemeine Java-Themen 37
O Fahrenheit/Celsius Converter funktioniert nicht Allgemeine Java-Themen 2
M Serialisierung funktioniert nicht Allgemeine Java-Themen 9
D Collections.sort funktioniert nicht in exportierten .class Dateien Allgemeine Java-Themen 10
J Arrays auf gleichheit untersuchen funktioniert nicht Allgemeine Java-Themen 11
P GUI: ArrayList anzeigen funktioniert nicht Allgemeine Java-Themen 5
H Timer funktioniert nicht? Allgemeine Java-Themen 3
R javax.comm --> Programm funktioniert nach Export nicht mehr Allgemeine Java-Themen 0
O Mein JButton Array funktioniert nicht Allgemeine Java-Themen 3
R Erste Schritte Object reference funktioniert nicht. Wie mach ichs richtig? Allgemeine Java-Themen 3
J If Abfrage funktioniert nicht Allgemeine Java-Themen 4
R Objekt funktioniert nicht auf iOS Allgemeine Java-Themen 15
U PersistenceManager.createEntityManager funktioniert nicht Allgemeine Java-Themen 3
D Java Datei nach Eclipse Export funktioniert nicht Allgemeine Java-Themen 0
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
H File.listFiles() funktioniert nicht... Allgemeine Java-Themen 10
JG12111989 Auswertung von Fragebogen funktioniert nicht! Allgemeine Java-Themen 7
M Primzahlberechnung funktioniert nicht. Allgemeine Java-Themen 4
A JFreeChart funktioniert nicht :( Allgemeine Java-Themen 6
C file.delete() funktioniert bei zweiten aufruf nicht mehr Allgemeine Java-Themen 3
F Datei einlesen funktioniert nicht Allgemeine Java-Themen 3
A Debugger im Java-Editor funktioniert nicht Allgemeine Java-Themen 5
B DB-Zugriff einer Webanwendung funktioniert nicht mit Java 7 Allgemeine Java-Themen 2
B Web-Anwendung funktioniert mit Java 1.8, aber nicht mit Java 1.7 (auf Client) Allgemeine Java-Themen 5
J Swing Cursor.WAIT funktioniert nicht nach JFileChooser Allgemeine Java-Themen 1
P Wie funktioniert das Feedback eines Klicks auf eine Java GUI Allgemeine Java-Themen 10
F JTextField funktioniert nicht Allgemeine Java-Themen 6
Athena Programm funktioniert nur beim Debugging korrekt, sonst nicht. Allgemeine Java-Themen 1
S CSV Eintrag der nächsten Zeile auslesen funktioniert nicht Allgemeine Java-Themen 8
S Command funktioniert in Kommandzeile aber nicht mit ProcessBuilder bzw. Runtime.exec auf MAC Allgemeine Java-Themen 3
G Verschlüsselungsalgorythmus funktioniert nicht Allgemeine Java-Themen 2
buggy84 Ausführen einer Batch mit Parameterübergabe funktioniert nicht richtig Allgemeine Java-Themen 18
G Befehl funktioniert in Eclipse allerdings nicht in einer Jar-Datei Allgemeine Java-Themen 3
N Werte aus Arrays auslesen funktioniert nicht Allgemeine Java-Themen 5
W getResources funktioniert nur in Eclipse, nicht in JAR Allgemeine Java-Themen 2
S Methode funktioniert nicht als ActionListener Allgemeine Java-Themen 4
M exec() funktioniert nicht Allgemeine Java-Themen 1
M RC4-Chiffre (funktioniert eingeschränkt) Allgemeine Java-Themen 6
X Datentypen Dropzone.options funktioniert nicht Allgemeine Java-Themen 1
D Java funktioniert nur mit deaktivierter Grafikkarte Allgemeine Java-Themen 3
L Erste Schritte Eclipse und Lokal funktioniert - in HTML nicht! Allgemeine Java-Themen 2
K MD5 funktioniert nicht korrekt !? Allgemeine Java-Themen 9
M JAR Datei erstellen funktioniert nicht Allgemeine Java-Themen 5
Q JLabel Textausgabe funktioniert nicht Allgemeine Java-Themen 4
E SimpleDateFormat-Konvertierung funktioniert nicht Allgemeine Java-Themen 3
T Dateidownload Funktioniert nicht Allgemeine Java-Themen 4
C Wie funktioniert Projektplanung? Allgemeine Java-Themen 18
K String.replace funktioniert nicht Allgemeine Java-Themen 3
G treeMap.putall funktioniert nicht?! Allgemeine Java-Themen 2
DaniSahne96 Threads Code funktioniert nicht wie er sollte Allgemeine Java-Themen 9
S Warum funktioniert die runable -.jar nicht? Allgemeine Java-Themen 7
P Eclipse Unter Windows erstelle .jar unter Linux (Ubuntu) funktioniert nicht Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben