简体   繁体   English

java notserializableexception但已实现可序列化

[英]java notserializableexception but implemented serializable

I try to write an object to my server with sockets, 我尝试使用套接字将对象写入服务器,

my object "Player" implemtents Serializable but if I'm try to write the object there is an notserializableexception. 我的对象“播放器”不支持序列化,但是如果我尝试编写该对象,则存在一个notserializableexception。 the objectoutputstream is saved in the object "player", this outputstream write the object "player" but it throws an exception objectoutputstream保存在对象“ player”中,此输出流写入对象“ player”,但会引发异常

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;
    }
}

here it trys to write the "Player" 在这里,它试图写“玩家”

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();
          }
      }
  }
}

how can I fix this? 我怎样才能解决这个问题?

Player中的所有字段都必须是可序列化的

private ObjectOutputStream out;
private ObjectInputStream in;

As the exception message will already have told you, these fields are not Serializable. 正如异常消息已经告诉您的那样, 这些字段不可序列化。

You need to make them transient , or more probably remove them from Player to somewhere else. 您需要使它们变为transient ,或者更有可能将它们从Player移到其他地方。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM