# Client Server - Serialisierung



## Joerg1990 (18. Sep 2013)

Hallo ihr Lieben,

ich hab ein Problem und zwar bin ich grade dabei ein Netzwerkfähiges Spiel zu implementieren. Als Framework benutze ich Kryonet. Nun bekomme ich bei der Übertragung folgende Fehlermeldung, kann die mir jemand deuten? 

Ich bräuchte dringend eure Hilfe, was ich machen muss.


```
00:03 ERROR: [kryonet] Unable to send UDP with connection: Connection 1
com.esotericsoftware.kryonet.KryoNetException: Error serializing object of type: game.Multiplayer
	at com.esotericsoftware.kryonet.UdpConnection.send(UdpConnection.java:105)
	at com.esotericsoftware.kryonet.Connection.sendUDP(Connection.java:95)
	at Netzwerk.GClient.sendMyMap2(GClient.java:183)
	at game.Multiplayer.positionUpdate(Multiplayer.java:536)
	at game.Multiplayer.update(Multiplayer.java:519)
	at org.newdawn.slick.state.StateBasedGame.update(StateBasedGame.java:278)
	at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:678)
	at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:456)
	at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:361)
	at game.Main.main(Main.java:57)
Caused by: com.esotericsoftware.kryo.KryoException: java.nio.BufferOverflowException
Serialization trace:
duration (game.Multiplayer)
multi (game.Multiplayer)
multi (game.Multiplayer)
multi (game.Multiplayer)
multi (game.Multiplayer)
```


----------



## MrClave (18. Sep 2013)

Wie sieht denn dein Code aus..?


----------



## Joerg1990 (19. Sep 2013)

Hallo MrClave,

ich hab eine Klasse (die enthält auch unter Klassen, die dadurch weiter versendet werden sollen) und dann halt eine Methode im Client, der ich das Objekt übergebe und dann zum Server versende. 

Anbei der Deklarierungsbereich der zu versendenen Klasse:

```
public class Multiplayer extends BasicGameState{


	//Animationen
	int[] duration;
	Image sprite;
	public  transient Image[][] walkUp, walkDown , walkRight, walkLeft, dead;
	public  static Animation[] movingUp;
	public  static Animation[] movingRight;
	public  static Animation[] movingDown;
	public  static Animation[] movingLeft;
	public  static Animation[] die;

	public  transient static Image[] win, loose;
	public  transient static Image bomberi, fire, bomb, bomb_up, disease, fire_up, kick, space, speed_up, invincible, life_up, power;
	public  transient static Image[] fields,grounds;
	public  transient static Image[] icons;

	public static components.Map map;
	public static int sizefield;
	public static int startx;
	public static int starty;
	public static float[][] startpos;
//	private float[][] positionUpdate = new float[5][5];
	public static int mod;
	public  int playerid;
	public static int playerzahl;
	public static String stat;
	public static int winner;
	public static int maxWins;
	public transient Timer timer = new Timer();
	public static int seconds;
	public transient  Timer gameTime = new Timer();
	public static boolean revange;
	public static Font font;

	public static int anzahlLeben = 0;
	public transient File mapFile;
	public static boolean online;
	public int playing;
	public int i = 0;
	public static  int j = 0;
	
	Multiplayer multi;
	public float[][] position = new float[2][2];
	public  GClient clientpl; //= new GClient(50000, 50000, 
	public  GServer serverpl; 

	public Multiplayer(){
	}
	
	public Multiplayer(int state, GClient client){
		clientpl = client;
		playerid			= clientpl.getID()-1;
		playerzahl			= clientpl.getID();
		anzahlLeben			= clientpl.getAnzahlLeben();
		maxWins		 		= clientpl.getMaxGewinne();
		online =true;
		this.playing=3;
		this.mapFile=new File( "maps/test.txt");
	}

	public Multiplayer(int state, GClient client, GServer server){
		clientpl = client;
		serverpl = server;
		playerid			= clientpl.getID()-1;
		playerzahl			= clientpl.getID();
		anzahlLeben 		= clientpl.getAnzahlLeben();								// clientpl.getAnzahLeben()-1, warum?
		maxWins		 		= clientpl.getMaxGewinne();
		online=true;
		this.playing=3;
		this.mapFile=new File( "maps/test.txt");
	}
	
	public Multiplayer(int state, int leben, int max, int playing, File mapFile){
		playerid = 0;
		anzahlLeben			= leben;
		maxWins		 		= max;
		online =false;
		this.playing = playing;
		this.mapFile =mapFile;
	}
```

Und hier die Methode innerhalb der Klasse, wo ich die selbige Klasse versenden möchte.


```
private void positionUpdate(){
			clientpl.sendMyMap2(this);
			this.map.bomber[0].position = clientpl.getMyMap().map.bomber[0].position;
			this.map.bomber[1].position = clientpl.getMyMap().map.bomber[1].position;
		}
	}
```

Zur Erklärung, die Klasse ist im Prinzip ein Player im Game und enthält alle Informationen über das Spiel und Ziel ist es, dass ich jeweils die Positionen und Bewegungen aller anderen Player registirere und update.

Irgendwo hab ich halt ein Logik Fehler. 

Vielen Dank.

Gruß Jörg


----------



## anti-held (19. Sep 2013)

Das Programm jammert, dass es das Objekt game.Multiplayer nicht serialisieren kann.
Die serialisierung ist für die Netzwerkkommunikation unerlässlich.

Die Lösung ist also, das Objekt serialisierbar zu machen:.
Und damit die IDE nicht meckert fügst du noch eine uid als statische variable hinzu und fertig:


```
public class Multiplayer extends BasicGameState implements Serializable{

   private static final long serialVersionUID = 1L;
```


----------



## Joerg1990 (19. Sep 2013)

Ja vielen Dank, aber ich hab trotzdem noch eig die gleiche Fehlermeldung, also muss es noch woanders dran liegen.

Vllt. liegt der Fehler daran, dass ich innerhalb der Klasse die gleiche Klasse übertragen werden soll ? oder ist es die Größe und es muss ein eigener Serializer geschrieben werden? 

Der Fehler nachfolgend: 


```
00:02  INFO: [kryonet] Connection 1 connected: /127.0.0.1
ich hab folgednde ID: 1 - Zutritt zum Server möglich
00:02  INFO: [kryonet] Connection 1 connected: /127.0.0.1
Ich als Client habe die ID: 1
Anzahl Leben: 1
00:04 ERROR: [kryonet] Unable to send UDP with connection: Connection 1
com.esotericsoftware.kryonet.KryoNetException: Error serializing object of type: game.Multiplayer
	at com.esotericsoftware.kryonet.UdpConnection.send(UdpConnection.java:105)
	at com.esotericsoftware.kryonet.Connection.sendUDP(Connection.java:95)
	at Netzwerk.GClient.sendMyMap2(GClient.java:187)
	at game.Multiplayer.positionUpdate(Multiplayer.java:540)
	at game.Multiplayer.update(Multiplayer.java:523)
	at org.newdawn.slick.state.StateBasedGame.update(StateBasedGame.java:278)
	at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:678)
	at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:456)
	at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:361)
	at game.Main.main(Main.java:57)
Caused by: com.esotericsoftware.kryo.KryoException: java.nio.BufferOverflowException
Serialization trace:
connectTcpPort (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
endPoint (com.esotericsoftware.kryonet.Client)
client (Netzwerk.GClient)
clientpl (game.Multiplayer)
	at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:585)
	at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
	at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504)
	at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
	at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
	at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504)....

Caused by: java.nio.BufferOverflowException
	at java.nio.DirectByteBuffer.put(Unknown Source)
	at com.esotericsoftware.kryo.io.ByteBufferOutputStream.write(ByteBufferOutputStream.java:42)
	at com.esotericsoftware.kryo.io.Output.flush(Output.java:154)
	at com.esotericsoftware.kryo.io.Output.require(Output.java:134)
	at com.esotericsoftware.kryo.io.Output.writeInt(Output.java:252)
	at com.esotericsoftware.kryo.serializers.DefaultSerializers$IntSerializer.write(DefaultSerializers.java:95)
	at com.esotericsoftware.kryo.serializers.DefaultSerializers$IntSerializer.write(DefaultSerializers.java:89)
	at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504)
	at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:576)
	... 436 more
```


----------



## Joerg1990 (19. Sep 2013)

Noch ein Hinweis, setzte ich den Client in der Deklarierung auf static bekomm ich keine Fehlermeldung, aber es wird scheinbar auch nichts übertragen, kann also keine Lösung sein.


----------



## MrClave (19. Sep 2013)

Wie ich schon einem anderen User hier empfohlen habe, erst mal die Objekt Orientierten Grundlagen zu erlernen, werde ich dies nun auch bei dir tun.

Deine Klasse ist extrem groß und einfach alles ist static.
Bevor man sich überhaupt ansatzweise an Netzwerke ranwagt, sollte man solche Dinge beherrschen.
Nicht böse gemeint, aber hast du schon mal was von High Cohesion und Low Coupling gehört ?
Sowas sollte man besonders hierbei beachten.
Und Grafiken sollte man auch nicht unbedingt über's Netz verschicken, da ein Client für die Visualisierung verantwortlich ist, und somit sowieso schon alles über die Grafikelemente wissen sollte.

Bau dir kleine Klassen, kleine Programme und versuch' dort erst mal das zu machen, was du hier im großen Stil versuchst.

So ganz blicke ich bei dir leider auch nicht durch, wodurch ich jetzt nicht viel dazu sagen kann, außer, dass man immer klein anfangen sollte, wenn man mit einem Thema noch nicht so vertraut ist.


----------



## Joerg1990 (19. Sep 2013)

Ja vielen Dank für deine Antwort, leider muss ich das im Zuge einer Vorlesung realisieren, auch in der Größe, ich werde mich also iwie (unschön) durch mogeln müssen;-)

Gruß 
Jörg


----------



## anti-held (19. Sep 2013)

Statische Variablen werden garnicht erst durch den Stream übertragen.
Alle Variablen, die du versendest müssen auch serialisierbar sein.

Mach also das was du oben gemacht hast auch noch bei GClient und GServer und deren Variablen, die von dir geschrieben sind.


----------

