2017-07-16 31 views
0

在過去的幾天裏,我一直在嘗試使用序列化來保存我的遊戲狀態。我對序列化並不熟悉,所以我一直在嘗試將我的播放器數據序列化爲一個名爲「Player.ser」的文件。現在,當玩家被反序列化時,結果是玩家爲空。當我運行序列化代碼時,它成功創建了文件,並且不會拋出任何異常,當我反序列化它時,它也不會拋出任何異常。就在我寫文件之前,我更改了播放器的名稱,所以我知道它已經保存了,但是當我反序列化它並獲取裝入的播放器名稱時,它將返回null。玩家的課程沒有正確序列化

這是我的播放器代碼:

package entity; 

import item.Item; 
import java.io.Serializable; 
import java.util.Random; 
import quests.Quest; 
import map.tiles.VoidTile; 

public class EntityPlayer extends entity implements Serializable{ 

public EntityPlayer(int x, int y, String name, int width, int height, int[] pxArry){   
    super(x,y); 

    this.direction = 0; 
    this.name = name; 
    this.width = width; 
    this.height = height; 
    this.pxArry = pxArry; 

    for(int i = 0; i < pxArry.length; i++) 
    for(int i2 = 0; i2 < pxArry[i].length; i2++){ 
     this.pxArry[i][i2] = pxArry[i][i2]; 
    } 

    this.inventory = new Item[0]; 

    this.createBasicStatsArry(); 
} 

Item[] inventory; 
Quest[] activeQuests, completedQuests; 
Status[] statusArry[]; 

@Override 
public String toString(){ 

    return "EntityPlayer [x=" + this.x +", y="+ this.y+", name="+ this.name+ ", width="+ this.width+", height="+this.height+", pxArry="+ this.pxArry+"]"; 
    } 
} 

這裏是運行我的串行代碼當玩家存儲遊戲:

try { 
    EntityPlayer tp= game.getPlayer(); 
    tp.setName("oldPlayer"); 
    ObjectOutputStream obs = new ObjectOutputStream(new FileOutputStream(new File("Player.ser"))); 

    obs.writeObject(tp); 
    obs.close(); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

這裏是我的解串器代碼:

if(new File("Player.ser").exists()){ 

    try { 
     ObjectInputStream oi = new ObjectInputStream(new FileInputStream("Player.ser")); 
     try { 

      EntityPlayer player = (EntityPlayer) oi.readObject(); 
      System.out.println("My name is: "+player.getName()); 
      oi.close(); 

     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 

      e.printStackTrace(); 
     } 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    }else{ 

     playerBlaze = new EntityPlayer(0,0,"Player",32,34,new int[][]{ar.makeImg("entityBlaze.png", 32, 34),ar.makeImg("entityClay.png", 32, 34)}, new int[]{1,100,100,5,5,5,5}, new int[]{1,100,100,5,5,5,5}); 
     player = playerBlaze; 
     System.out.println("My name is "+player.getName()); 
    } 

正如我前面所說,我是使用序列化的新手,所以知道這段代碼有什麼問題會很有幫助。另外如果你知道任何資源來學習序列化或只是一般的java,我很想聽聽他們。

+2

簡化並解決。嘗試使用一個簡單的類來進行序列化,該類只有一個名稱字符串,然後看看會發生什麼。如果它運作良好,請繼續加入課程,直到你得到你想要的。如果沒有,那麼你可以通過發佈很小的代碼,爲我們編譯,爲我們運行並向我們展示你的問題 - 一個[mcve]來問一個更好的問題。 –

回答

1
EntityPlayer player = (EntityPlayer) oi.readObject(); 

你的陰影與此局部變量聲明類的成員,所以,當你執行這條線類的成員不會改變。

+0

哇,我沒有注意到。我設法解決了我的問題。當我將玩家添加到地圖時,我實際上是在調用playerBlaze而不是玩家。由於玩家是被序列化的玩家,playerBlaze爲空。 –