Java 播放器';s类未正确序列化

Java 播放器';s类未正确序列化,java,serialization,null,Java,Serialization,Null,在过去的几天里,为了保存我的游戏状态,我一直在尝试序列化。我对序列化相当陌生,所以我一直在尝试将我的播放器数据序列化到一个名为“Player.ser”的文件中。从现在开始,当播放器被反序列化时,它将导致播放器为null。当我运行序列化代码时,它成功地创建了文件并且没有抛出任何异常,当我反序列化它时,它也没有抛出任何异常。在编写文件之前,我更改了播放器的名称,以便知道它已保存,但是当我反序列化它并获取加载的播放器名称时,它返回null 这是我的播放器代码: package entity; imp

在过去的几天里,为了保存我的游戏状态,我一直在尝试序列化。我对序列化相当陌生,所以我一直在尝试将我的播放器数据序列化到一个名为“Player.ser”的文件中。从现在开始,当播放器被反序列化时,它将导致播放器为null。当我运行序列化代码时,它成功地创建了文件并且没有抛出任何异常,当我反序列化它时,它也没有抛出任何异常。在编写文件之前,我更改了播放器的名称,以便知道它已保存,但是当我反序列化它并获取加载的播放器名称时,它返回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+"]";
    }
}
以下是我的反序列化程序代码:

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的资源,我很想听听

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

您正在使用此局部变量声明隐藏类成员,因此在执行此行时不会更改该类成员。

简化并求解。尝试用一个更简单的类序列化,一个只有名称字符串的类,然后看看会发生什么。如果有效,很好,继续增加课程内容,直到你得到你想要的。如果没有,那么你可以问一个更好的问题,发布一些小代码,为我们编译,为我们运行,并为我们演示你的问题——哇,我没有注意到这一点。我设法解决了我的问题。当我将玩家添加到地图时,我实际上是在调用playerBlaze而不是player。因为player是被序列化的那个,所以playerBlaze是空的。
EntityPlayer player = (EntityPlayer) oi.readObject();