【问题标题】:Serialization and Deserialization in Java [closed]Java中的序列化和反序列化[关闭]
【发布时间】:2012-09-22 03:08:20
【问题描述】:

我刚刚关注了Tutorial 进行序列化,我想知道为什么它不起作用。我有一个这样的游戏类:

import java.io.Serializable;

public class Game implements Serializable{

    private static final long serialVersionUID = -4795536311274486893L;
    protected int SHOT_SPEED;
    protected int PLAYER_SPEED;
    Player player;
    ArrayList<SpaceObject> objects;
    int level, score;
    Dimension resolution;
    and so on...

我的阅读器方法应该处理对象 IO,如下所示:

public boolean saveGame(Game game) {
        try {
            FileOutputStream fileOut = new FileOutputStream(defaultDataName+".ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);

            out.writeObject(game);

            out.close();
            fileOut.close();
            return true;
        }
        catch (IOException i) {
            return false;
        }

    }

    public Game loadGame() throws IOException {
        if (readRawData(defaultDataName) == "") throw new IOException("Data was deleted");
        Game game = null;
        try {
            FileInputStream fileIn = new FileInputStream(defaultDataName+".ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);

            game = (Game) in.readObject();

            in.close();
            fileIn.close();
        }
        catch (ClassNotFoundException e) {
            throw new IOException("Class not Found: " + e.getMessage());
        }
        return game;
    }  

在我看来,我所做的一切都与教程中的完全一样,所以为什么不成功。 (它会抛出 ClassNotFoundError。感谢您的帮助!

【问题讨论】:

  • 找不到哪个类?这是您删除的课程吗?
  • Player类,那么包含的每个Class都必须实现Serializable吗?
  • 每个类都需要实现Serializable,包括任何外部类,但如果你得到ClassNotFoundException,这意味着找不到类
  • 当你捕捉到异常时,从不只需要return false;。始终记录原因。否则你没有希望找出问题所在。
  • 是的,我真的应该开始这样做,这对我以后真的很有帮助

标签: java object serialization deserialization


【解决方案1】:

运行第二种方法时,该类似乎不在您的类路径中。

  • 能否发布整个异常消息?
  • 您是否使用具有相同类路径的序列化和反序列化程序?

【讨论】:

    【解决方案2】:

    包含在 Serializable 标记类中的每个类都应该是可序列化的。我认为这就是你得到的错误。

    【讨论】:

    • 不这样做不会导致ClassNotFoundException。 @DanielSchmidt 这不可能是正确的答案,除非你没有告诉我们其他事情。