# List Deserialisierung entfernt Objekte



## CrashKurs (24. Apr 2015)

Hey Leute,

ich programmiere zurzeit zum Spaß ein Netzwerkspiel für Doppelkopf und bin auf einen Fehler gestoßen, der mich ratlos macht. Ich habe, bevor das Spiel startet, eine Lobby, zu der Spieler sich verbinden können.
Nachdem ein Spieler sich verbunden hat, wird an alle Spieler eine Nachricht geschickt, in der Informationen zur Lobby enthalten sind, welche in der GUI angezeigt werden sollen(zur Zeit nur Spielerobjekte in einer Liste). 
Beim Senden dieser Nachricht hat diese Liste die richtige Größe, nur wenn diese Nachricht bei den Spieler ankommt, fehlen dort alle Spielerobjekte, welche sich nach dem eigenen Verbinden verbunden haben.
Als Beispiel: 
Spieler 1 erstellt den Server
Spieler 2 verbindet sich und sieht in der Lobby Spieler 1 und 2
Spieler 3 verbindet sich und sieht in der Lobby Spieler 1,2 und 3
Spieler 2 sieht weiterhin nur Spieler 1 und 2 in der Lobby, Spieler 1 und 3 sehen alles

Ich habe zum Testen bereits einen Integer mitgeschickt, der die Listengröße speichert und dieser hat auch beim Spieler 2 den Wert 3, die Liste allerdings nur 2 Objekte.

Die Nachrichten werden mit ObjectOutputStream und ObjectInputStream von einem Socket/ServerSocket gesendet/empfangen

Hat jemand von euch schonmal solch ein Problem gehabt und kann mir helfen?

Hier die einzelnen Klassen und Methoden:

```
public class Player extends Entity {

	private static final long serialVersionUID = 7166160897222310950L;
	
	private String name = "";

        public Player(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}
}
```


```
public abstract class Entity implements Serializable {

	private static final long serialVersionUID = -6163438352827657353L;

}
```


```
public class Table extends Entity {
	
 	private static final long serialVersionUID = -4887168039027506598L;

	 private List<Player> players;

	  public Table() {
		 players = new LinkedList<Player>();
	  }

	 public List<Player> getPlayers() {
		return players;
	}

 	public void addPlayer(Player player) {
		if(!players.contains(player))
		{
			 players.add(player);
		}
	}
}
```


```
public class GameController extends AbstractController {

	private Table table;

        public GameController() {
		table = new Table();
	}

        private void playerWantsToJoinLobby(Player player)
	{
                table.addPlayer(player);
                UpdateLobbyEvent ev1 = new UpdateLobbyEvent(table.getPlayers());
		getEventBus().addDokoEvent(ev1);
        }
}
```
ExternalEvent sind alle Nachrichten, welche übers Netzwerk verschickt werden. Ein EventBus mit Consumer wartet auf diese Events und sendet sie zu allen Spielern

```
public class UpdateLobbyEvent extends ExternalEvent {

	private static final long serialVersionUID = -4286761159555969836L;

	private final List<Player> players;
	
	private int playerSize;

	public UpdateLobbyEvent(List<Player> players)
	{
		this.players = players;
		this.playerSize = players.size();
	}

	public List<Player> getPlayers() {
		return players;
	}

	public int getPlayerSize() {
		return playerSize;
	}
}
```
Senden der Nachricht

```
public void sendMessage(ExternalEvent event) {
		try {
			output.writeObject(event);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
```
Empfangen der Nachricht

```
while ((object = input.readObject()) != null) {
				if (object instanceof ExternalEvent) {
					ExternalEvent event = (ExternalEvent) object;
                                if(event instanceof UpdateLobbyEvent)
			        {
				        System.out.println("Sending new lobby: " + ((UpdateLobbyEvent) event).getPlayerSize());
				        System.out.println("listSize: " + ((UpdateLobbyEvent) event).getPlayers().size());
			        }
```

Genau beim Empfangen der Nachricht treten die Probleme auf und die beiden Attribute sind wie in dem Beispiel teilweise unterschiedlich groß.

Wäre für jede Hilfe dankbar! 

Viele Grüße,
Crashkurs


----------



## AntiMuffin (24. Apr 2015)

Hallo, 
also um dir zu Helfen bräuchte ich noch den Server, da wenn du beim Empfang schon die Fehler hast, diese evtl entstehen wenn du sendest.
Gib mal bei jedem benutzer die Nachricht (Größe) aus die er bekommt und Poste diese bitte auch noch.

Gruß,
AntiMuffin


----------



## CrashKurs (24. Apr 2015)

Hey AntiMuffin!

Spieler 1 (Server): 
Sending length: 429 Bytes
[7]Sending UpdateLobbyEvent to 127.0.0.1:32459
[8]Sending UpdateLobbyEvent to 127.0.0.1:32477

Spieler 2:
Received length: 411 Bytes
Receiving new Event
[5]Receiving UpdateLobbyEvent from 127.0.0.1:5000

Spieler 3:
Received length: 429 Bytes
Receiving new Event
[3]Receiving UpdateLobbyEvent from 127.0.0.1:5000

Ich habe mal die readObject/writeObject Methoden der Klasse Player überschrieben und geloggt.
Bei Spieler 2 werden diese Methoden nicht aufgerufen - kann es sein, dass er die Spieler-Liste aus der vorherigen Nachricht intern cached  und der "Neuankömmling" bei der Deserialisierung als identisch erkannt wird?

Log-Nachricht der readObject/writeObject Methoden

Spieler 1 (Server): 
Writing player to stream
Writing player to stream
Writing player to stream

Spieler 2:
Leer

Spieler 3:
Reading player from stream
Reading player from stream
Reading player from stream

Schonmal Dankeschön für deine Hilfe!

Viele Grüße,
Crashkurs


----------

