0

我試着對象寫信給我帶插座的服務器,java的notserializableexception但實現序列化

我的目標「玩家」 implemtents序列化,但如果我嘗試寫對象有一個notserializableexception。用ObjectOutputStream保存在對象「玩家」,這爲OutputStream寫入對象「玩家」,但它拋出一個異常

package ch.tbz.robin.model; 

import java.io.*; 

import java.net.Socket; 

public class Player implements Serializable{ 

    private Socket socket; 
    private ObjectOutputStream out; 
    private ObjectInputStream in; 
    private String username; 
    private String password; 
    int id; 
    int level; 
    int health; 
    int xp; 
    int damage; 

    public void setSocket(Socket socket) { 
     this.socket = socket; 
     try { 

      out = new ObjectOutputStream(socket.getOutputStream()); 
      in = new ObjectInputStream(socket.getInputStream()); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public ObjectOutputStream getOut() { 
     return out; 
    } 

    public ObjectInputStream getIn() { 
     return in; 
    } 

    public Socket getSocket() { 
     return socket; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public void setHealth(int health) { 
     this.health = health; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public void setLevel(int level) { 
     this.level = level; 
    } 

    public void setXp(int xp) { 
     this.xp = xp; 
    } 

    public void setDamage(int damage) { 
     this.damage = damage; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public int getLevel() { 
     return level; 
    } 

    public int getHealth() { 
     return health; 
    } 

    public int getXp() { 
     return xp; 
    } 

    public int getDamage() { 
     return damage; 
    } 
} 

這裏改掉寫的「玩家」

package ch.tbz.robin.application; 
import ch.tbz.robin.model.Attack; 
import ch.tbz.robin.model.Player; 
import ch.tbz.robin.model.Session; 

import java.io.*; 
import java.net.SocketException; 

public class Game extends Thread implements Serializable{ 
    private Session session; 
    public Game(Session session) { 
     this.session = session; 
     player1 = null; 
     player2 = null; 
    } 
    private Player player1; 
    private Player player2; 

    public void run(){ 
     player1 = session.getPlayer1(); 
     player2 = session.getPlayer2(); 

     try { 

     System.out.println("here"); 
     player1.getOut().writeObject(player1); 
     player1.getOut().writeObject(player2); 
     player2.getOut().writeObject(player2); 
     player2.getOut().writeObject(player1); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     boolean notend = true; 
     while(notend) { 
      try { 

       Attack attack1 = (Attack) player1.getIn().readObject(); 
       Attack attack2 = (Attack) player2.getIn().readObject(); 

       player1.setHealth(player1.getHealth() - attack2.setDamage(player2.getDamage())); 
       player2.setHealth(player2.getHealth() - attack1.setDamage(player1.getDamage())); 

       if (player1.getHealth() < 0) { 
        notend = false; 
       } 
       if(player2.getHealth() < 0) { 
        notend = false; 
       } 

      player1.getOut().writeObject(attack1); 
      player1.getOut().writeObject(attack2); 
      player2.getOut().writeObject(attack2); 
      player2.getOut().writeObject(attack1); 

      } catch (SocketException e){ 
       System.out.println("user disconnected"); 
       notend = false; 
      } catch (ClassNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

我怎麼能解決這個問題?

+0

您應該將正在獲取的異常的堆棧跟蹤添加到問題中。 –

回答

0
private ObjectOutputStream out; 
private ObjectInputStream in; 

由於異常消息將已經告訴你了,這些字段不可序列化。

您需要將它們製作成transient,或者更有可能將它們從Player中移除到其他地方。

+0

啊..我雖然只有班:),謝謝 –

+0

我不知道我必須添加短暫 –

+0

你沒有讀過什麼異常實際上說。 – EJP

0

在播放器的所有字段必須是一個序列化

+0

啊..我雖然只有班:),謝謝 –

相關問題