# ObjectInputStream StringCorruptedException



## Xerses (23. Jun 2011)

Hallo zusammen,

ich bastele derzeit an einem kleinen Programm herum, welches Netzwerkeigenschaften aufweist.

Zu meinem Problem:

Ich programmiere gerade das Login, was leider noch nicht ganz funktioniert. Ich bekomme an einer Stelle eine StringCorruptedException



```
public class Login implements Runnable {

    InputStream is;
    OutputStream os;
    ObjectOutputStream oos;

    public Login(InputStream is, OutputStream os) {
        this.is = is;
        this.os = os;
        try {
            oos = new ObjectOutputStream(this.os);
        } catch (IOException ex) {
            System.out.println(ex);
        }
    }

    @Override
    public void run() {

        String input = "";
        String[] inputForLogin;
        String username = "";
        String password = "";
        boolean usernameCorrect = false;
        boolean passwordCorrect = false;
        String answer = "ACK";

        try {
            oos.writeObject(answer);
            input = (String) new ObjectInputStream(is).readObject();
            System.out.println(input);

            //....
        } catch (Exception e) {
            System.out.println("Fehler beim Senden: "+e);
        }                
    }
}
```

Ich schätze es liegt am 
	
	
	
	





```
input = (String) new ObjectInputStream(is).readObject();
```


Mit dieser Methode habe ich es an einer anderen Stelle auch gemacht und es funktioniert.


----------



## SlaterB (23. Jun 2011)

eine StringCorruptedException gibts in der normalen API gar nicht,
sicher dass es keine StreamCorruptedException ist?

bei der Suche nach StringCorruptedException kam ich lustigerweise an gleicher Verwechselung vorbei, falls bei dir auch eine:
http://www.java-forum.org/netzwerkp...corruptedexception-invalid-string-header.html
der Fehler dort ist bei dir ohne Schleife eher nicht zu sehen, aber hilft es vielleicht doch?
auf Streams immer sehr genau achten, nicht doppelt definieren usw.

edit zur unteren Antwort:
oh ja, wenn der Server nur einen String als normalen Text sendet, vielleicht gar ein nicht-Java-Server,
aber selbst in Java alles andere als ein ObjectOutputStream wäre schon eine Katastrophe


----------



## Kr0e (23. Jun 2011)

Naja... ich vermute du verwendest die Streams falsch...

Ein ObjectOutputStream schreibt bei einer Erstellung 2 Short-Werte und ein ObjectInputStream liest bei einer Erstellung 2 Short Werte....

Wenn du das nicht beachtest kommen solche Fehler  Du hast nicht genug Code gesendet um den Fehler 100% zu identifizieren, z.B. wäre die GEgenseite noch interessant.... 

Ich zeige dir hier am ObjectOutputStream was ich meine:

Bei writeObject() wird intern das hier aufgerufen "writeStreamHeader();"

Code von writeStreamHeader():


```
/**
     * The writeStreamHeader method is provided so subclasses can append or
     * prepend their own header to the stream.  It writes the magic number and
     * version to the stream.
     *
     * @throws	IOException if I/O errors occur while writing to the underlying
     * 		stream
     */
    protected void writeStreamHeader() throws IOException {
	bout.writeShort(STREAM_MAGIC);
	bout.writeShort(STREAM_VERSION);
    }
```

Frag mich nich, warum es die Magicnumber ist... Die SUN-Progger haben vlt ne Schraube locker  Aber immerhin Sinn für Humor ^^

Beachte diese eifnache Regel und du hast nie Probleme mit Serialisierung


----------



## Xerses (23. Jun 2011)

Ich hab jetzt überall wo ich was sende oder empfange ein neues ObjectInput- bzw. OutputStream erstellt. Auf diese Weise funktionieren meine Übertragungen.


----------

