免责声明--这是学校学期项目的一部分。
我们应该使用Memento模式来保存对象状态。这个对象是MVC中的一个模型。所以我现在的方法是(简化):
public class Model {
// ...
public static class Memento implements Serializable {
protected Stats stats;
public Memento(Stats stats) {
this.stats = stats;
}
}
public static class Stats implements Serializable {
protected int score;
protected int cannonPos;
protected int cannonAngle;
protected int cannonSpeed;
protected int totalShotsFired = 0;
protected int enemiesHit;
protected transient List<StatsObserver> observers = new ArrayList<StatsObserver>();
// + getters etc
}
}我已经读过,在Java中有一个可序列化的内部类,而外部类却不是,这是不可能的,原因是合理的。但是,在我的例子中,当内部类是实例化时,我不需要实例化外部类。内在根本不需要外部。它只是这样的结构,以便外部类可以访问内部的成员。
这就是我的课程记忆描述中所说的:

..。这也是有道理的。只有模型才能访问Memento中的详细信息。“管理员”对象(一个处理保存/从磁盘中保存/检索数据的对象)不应该在对象内部看到。因为Java没有朋友类,所以应该这样做。
这是否意味着为了像建议的那样实现它,我不能使用序列化?
编辑:
我创建了Memento类静态,以及Stats类,但我仍然收到错误。在this中似乎还存在Model.Stats引用。
java.io.NotSerializableException: cz.melkamar.adp.shooter.model.Model
- field (class "cz.melkamar.adp.shooter.model.Model$Stats", name: "this$0", type: "class cz.melkamar.adp.shooter.model.Model")
- object (class "cz.melkamar.adp.shooter.model.Model$Stats", cz.melkamar.adp.shooter.model.Model$Stats@de1a1b8)
- field (class "cz.melkamar.adp.shooter.model.Model$Memento", name: "stats", type: "class cz.melkamar.adp.shooter.model.Model$Stats")
- root object (class "cz.melkamar.adp.shooter.model.Model$Memento", cz.melkamar.adp.shooter.model.Model$Memento@1e920c72)发布于 2016-11-29 14:25:16
非静态内部类的实例具有对其外部类实例的隐藏引用。这意味着,如果要序列化内部类的实例,则外部类的实例将与其一起序列化。如果外部类不可序列化,您将得到一个java.io.NotSerializableException。
如果不希望外部类的实例与内部类的实例一起序列化,则使内部类static
public class Model {
// ...
public static class Memento implements Serializable {
protected ModelData data;
// ...
}
}static内部类没有对其外部类的实例的引用。
https://stackoverflow.com/questions/40867992
复制相似问题