Java Serializable Saving

时间:2012-07-13 08:31:51

标签: java serializable

我正在为我正在制作的游戏开设这个课程,我正在尝试保存ArrayList笔记。当我注销时,它正确打印大小,例如,如果我有5个音符,当我注销notes.getSize()将是5,但是当我登录时,它会重置为空。为什么不保存笔记?

public class Notes implements Serializable {

    private static final long serialVersionUID = -4947870743226160329L;
    private ArrayList<Note> notes = new ArrayList<Note>(30);

    public class Note implements Serializable {

        private static final long serialVersionUID = -4589885080580317958L;

        private int color = 0;
        private String text = "";

        public Note(int color, String text) {
            this.setColor(color);
            this.setText(text);
        }

        public void setText(String text) {
            this.text = text;
        }

        public String getText() {
            return text;
        }

        public void setColor(int color) {
            this.color = color;
        }

        public int getColor() {
            return color;
        }
    }

    private transient Player player;

    public Notes(Player p) {
        this.player = p;
    }

    public void addNote(String text) {
        System.out.println("Note Text: "+text);
        if (text.length() > 50) {
            player.getPackets().sendGameMessage("You can only enter notes up to 50 characters!");
            return;
        }
        if (notes.size() < 30) {
            notes.add(new Note(0, text));
        } else {
            player.getPackets().sendGameMessage("You cannot add more then 30 notes!");
            return;
        }
        int NoteId = notes.size() - 1;
        player.getPackets().sendConfig(1439, NoteId);
        player.getTemporaryAttributtes().put("selectedNote", NoteId);
        refreshNotes(false);
    }

    public void addNote(String text, int color) {
        notes.add(new Note(color, text));
    }

    public void loadNotes() {
        player.getPackets().sendIComponentSettings(34, 9, 0, 30, 2621470);
        player.getPackets().sendHideIComponent(34, 3, false);
        player.getPackets().sendHideIComponent(34, 44, false);
        player.getPackets().sendIComponentText(34, 13, "Loading notes<br>Please wait...");
        player.getPackets().sendConfig(1439, -1);
        refreshNotes(true);
    }

    public void refreshNotes(boolean sendStartConfigs) {
        for (int i = 0; i < 30; i++) {
            player.getPackets().sendGlobalString(149 + i, i < notes.size() ? notes.get(i).getText() : "");
        }
        if (sendStartConfigs) {
            for (int i = 1430; i < 1450; i++)
                player.getPackets().sendConfig(i, i);
        }
        player.getPackets().sendConfig(1440, getFirstTotalColorValue());
        player.getPackets().sendConfig(1441, getSecondTotalColorValue());
    }


    public int intColorValue(int color, int noteId) {
        return (int) (Math.pow(4, noteId) * color);
    }

    public int getFirstTotalColorValue() {
        int Color = 0;
        for (int i = 0; i < 15; i++) {
            if (notes.size() > i)
                Color += intColorValue(notes.get(i).getColor(), i);
        }
        return Color;
    }

    public int getSecondTotalColorValue() {
        int color = 0;
        for (int i = 0; i < 15; i++) {
            if (notes.size() > (i + 16))
                color += intColorValue(notes.get(i + 16).getColor(), i);
        }
        return color;
    }

    public void deleteSelectedNote() {
        if ((int)player.getTemporaryAttributtes().get("selectedNote") > -1) {
            int slot = (int) player.getTemporaryAttributtes().get("selectedNote");
            notes.remove(slot);
            player.getTemporaryAttributtes().put("selectedNote", -1);
            player.getPackets().sendConfig(1439, -1);
            refreshNotes(false);
        }
    }

    public void clear() {
        notes.clear();
        refreshNotes(false);
    }

    public void editNote(String string, int index) {
        notes.get(index).setText(string);
        refreshNotes(false);
    }

    public void setColor(int color, int index) {
        notes.get(index).setColor(color);
        refreshNotes(false);
    }

    public void deleteNote(int slot) {
        notes.remove(slot);
        refreshNotes(false);
    }

    public void setNotes(ArrayList<Note> setNotes) {
        notes = setNotes;
        refreshNotes(false);
    }

}

这是我在

中管理保存/加载的课程

公共类SerializableFilesManager {

private static final String PATH = "data/characters/";
private static final String BACKUP_PATH = "data/charactersBackup/";

public synchronized static final boolean containsPlayer(String username) {
    return new File(PATH + username + ".p").exists();
}

public synchronized static Player loadPlayer(String username) {
    try {
        return (Player) loadSerializedFile(new File(PATH + username + ".p"));
    } catch (Throwable e) {
        Logger.handle(e);
    }
    try {
        Logger.log("SerializableFilesManager", "Recovering account: "
                + username);
        return (Player) loadSerializedFile(new File(BACKUP_PATH + username
                + ".p"));
    } catch (Throwable e) {
        Logger.handle(e);
    }
    return null;
}

public static boolean createBackup(String username) {
    try {
        Utils.copyFile(new File(PATH + username + ".p"), new File(
                BACKUP_PATH + username + ".p"));
        return true;
    } catch (Throwable e) {
        Logger.handle(e);
        return false;
    }
}

public synchronized static void savePlayer(Player player) {
    try {
        storeSerializableClass(player, new File(PATH + player.getUsername()
                + ".p"));
    } catch (ConcurrentModificationException e) {
        //happens because saving and logging out same time
    } catch (Throwable e) {
        Logger.handle(e);
    }
}

public static final Object loadSerializedFile(File f) throws IOException,
        ClassNotFoundException {
    if (!f.exists())
        return null;
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));
    Object object = in.readObject();
    in.close();
    return object;
}

public static final void storeSerializableClass(Serializable o, File f)
        throws IOException {

    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
    out.writeObject(o);
    out.close();
}

private SerializableFilesManager() {

}

}

3 个答案:

答案 0 :(得分:2)

  1. 不要将播放器标记为瞬态,因为您正在保存它,瞬态会阻止来自 获得保存,并在反序列化时将玩家带到默认值null

  2. 您是否将播放器类序列化?

  3. 整个对象图被序列化或无 ...瞬态的目的是在序列化过程中使特定成员保持关闭状态这样,序列化过程顺利进行。

  4. 例如,假设在游戏中我们希望保持玩家的进度和该会话的游戏时间,而不是开始和结束时间。因此,开始和结束时间可以是暂时的。

答案 1 :(得分:1)

您应该使用以下命令保存ArrayList:

 FileOutputStream fos = null;
    ObjectOutputStream out = null;
    try {
        fos = new FileOutputStream("filename",false);
        out = new ObjectOutputStream(fos);
        out.writeObject(notes);
        out.close();
        System.out.println("Object Persisted");
    } catch (IOException ex) {
        ex.printStackTrace();
    }

当您打开项目时,请使用以下内容导入Arraylist:

    FileInputStream fos;
    try {
            fos = new FileInputStream("filename");
             ObjectInputStream oos = new ObjectInputStream(fos);
             notes=(ArrayList) oos.readObject();
                fos.close();
            {
          catch {
        }

答案 2 :(得分:1)

那是因为您的Playertransient ...我试图在其他示例中展示您的逻辑...当Player设置为private时,序列化已经成功并且所有数据都已加载回来。否则,当瞬态时,播放器引用为null,它仅加载其他序列化字段,如int。如果transient Player中只有class字段,则NullPointerException会出现,但ArrayListsize > 0