2015-05-05 4 views
-1

Я пытаюсь реализовать функцию save/load для игры, которую я разрабатываю. В принципе, у меня есть основной класс, который выполняет весь рендеринг и обновляет объект состояния игры (объект состояния игры содержит игрока, врагов и их соответствующие позиции, скорости и т. Д.). Поэтому я думал, что просто сохраню объект состояния игры в файле usingObjectOutputStream и загрузите ObjectInputStream. Сохранение/загрузка, кажется, работает нормально, до момента, когда я выполняю оператор if в поле String в классе проигрывателя. Я переделал код как короткий, чтобы воспроизвести странное поведение.Странное поведение после использования ObjectInputStream

Игрок Класс:

import java.io.Serializable; 

public class Player implements Serializable 
{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = -5933597609049497854L; 
    private String type; 

    public Player() 
    { 
     type = "evil"; 
    } 

    public String getType() 
    { 
     return type; 
    } 


    public void setType(String type) 
    { 
     this.type = type; 
    } 
} 

Главный класс:

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 

public class Main 
{ 
    private Player player; 

    public Main() 
    { 
     player = new Player(); 

     System.out.println("player.getType(): "); 
     System.out.println(player.getType()); 
     System.out.println("player.getType() == evil: "); 
     System.out.println(player.getType() == "evil"); 

     saveGame(); 

     loadGame(); 

     System.out.println("player.getType(): "); 
     System.out.println(player.getType()); 
     System.out.println("player.getType() == evil: "); 
     System.out.println(player.getType() == "evil"); 
    } 

    public static void main(String[] Args) 
    { 
     new Main(); 
    } 

    private void saveGame() 
    { 
     try 
     { 
      FileOutputStream out = new FileOutputStream("save"); 

      ObjectOutputStream objectOut = new ObjectOutputStream(out); 

      objectOut.writeObject(player); 

      objectOut.close(); 

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

    private void loadGame() 
    { 
     try 
     { 

      FileInputStream fin = new FileInputStream("save"); 

      ObjectInputStream objectIn = new ObjectInputStream(fin); 

      player = null; 

      player = (Player) objectIn.readObject(); 

      objectIn.close(); 

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

Я получаю следующий вывод программы:

player.getType():
зло
player.getType() == evil:
true player.getType():
зло
player.getType() == зла:
ложь

Почему поле type не распознается как "зло"?

+1

'player.getType() ==" evil "Использовать метод equals при сравнении объектов String. – copeg

+1

'==' не может использоваться для сравнения строк (или объектов вообще) - по крайней мере, не с ожидаемым результатом. вместо этого используйте 'equals'. Кроме того, некоторые исследования, прежде чем спрашивать -.- – Paul

ответ

0

Потому что Object равенство проверено с .equals. Если вы используете ==, вы проверяете ссылочное равенство, а два экземпляра эквивалентного значения могут (и с сериализацией) иметь разные ссылки. Вам нужно что-то вроде

player.getType().equals("evil") 
Смежные вопросы