# Problem mit Object-Stream



## Chase (12. Feb 2007)

Ich habe eine urspruenglich kleine Anwendung programmiert, deren Umfang mir etwas aus den Haenden geglitten ist.. jedenfalls habe ich jetzt ein 4000-Zeilen umfassendes Server-Client-Spiel, im Grunde sowas wie "Pong".

Ich hab eine Client und eine Serveranwendung mit Sockets realisiert. Mit Hilfe viel zu vieler Threads )) kommunizieren beide Programme. Geplant war das ganze folgendermassen: Der Client schicht einfach einen int-Wert an den Server, der die aktuelle Position des Schlaegers angibt. Unabhaengig davon, schickt der Server die gesamte 'Pong'-Klasse an den Client, der mit dieser seine eigene ueberschreibt. Dazu verwende ich einen ObjectInputStream, bzw einen ObjectOutputStream. Allerdings kommen die Objekte falsch an. Ich hab beide Programme durch den Debugger laufen lassen:
Server-Code

```
try{
      // Hier hat das Objekt laut Debugger die richtigen Daten
      Object o = messageStack.pop();
     out.writeObject(o);
     }
     catch(IOException e)
     //..
```
Client-Code:

```
try{
      // Hier kommt zwar ein Objekt des richtigen Typs an, allerdings sind alle Felder default
      // Also genauso wie sie nach dem Aufruf des Standardkonstruktors aussaehen.
      Object o = in.readObject();
            parseObject(o);                   
       }
      catch(IOException e)
      //..
```
Testweise hab ich mir selbst Methoden zur (De-)Serialisierung geschrieben, sowas wie _String toMessage()_ und _void fromMessage()_. Damit klappt es seltsamerweise.
Noch was: Komischerweise klappt die UEbertragung des ersten Objekts. Alles was ich danach schicke ist leer 

Hat da jemand eine Idee?


----------



## Guest (13. Feb 2007)

Hilft das hier?
	
	
	
	





```
out.writeObject(o);
out.flush();
```


----------



## Chase (13. Feb 2007)

Hab ich auch schon probiert, es hilft leider nicht.
Die Objekte kommen ja an, sie werden nur falsch zusammengesetzt (sprich, sie sind leer).

Wie genau funktioniert denn das Ueberladen der readObject und writeObject Methoden, vielleicht hilft das ja ?

```
public void writeObject(java.io.ObjectOutputStream out)
    {
        try{
        out.writeInt(testint);
        }catch(java.io.IOException e){}
    }
    
    publicvoid readObject(java.io.ObjectInputStream in)
    {
        try{
        testint = in.readInt();
        }catch(java.io.IOException e){}          
  }
```
DAS kann's ja nicht gewesen sein, wie soll der ObjectInputStream denn dann erkennen um was fuer ein Object es sich handelt..


----------



## Guest (14. Feb 2007)

Die readObject und writeObject Methoden müssen *private* sein und dass mit dem
"Verschlucken von Exceptions" ( catch(...) {} ) würde ich mir an deiner Stelle sehr schnell 
abgewöhnen. So etwas suchst du in einer grösseren Anwendung seeeehr lange.

Verwede am besten die Signaturen so, wie sie in java.io.Serializable (in API-Doku) beschrieben sind.
	
	
	
	





```
private void writeObject(java.io.ObjectOutputStream out) throws IOException
{
   out.writeInt(testint);
}

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
{
   testint = in.readInt();
}
```


----------

