我正在编写一个游戏,游戏具有一组应从XML文件加载或保存到XML文件的规则。

我有一个可以对自身进行序列化和反序列化的UnitType类。
我也有一个Faction类,可以加载/保存到XML。
我有一个包含的规则类

UnitType[] unitTypes;
Faction[] factions


加载规则时,我首先加载所有单元类型对象并将其引用存储到unitTypes中,然后加载派系并将对它们的引用存储到factions中。

但是,Faction类还具有成员数组UnitType[] accessibleUnitTypes,该成员数组显示此派系可以构建的单元类型,我也需要加载它。

问题来了:由于引用只是一个地址,序列化没有任何意义(在Java中也是不可能的),因此我需要在long ID类内创建一个特殊字段UnitType和一个特殊的Manager类,具有方法getUnitTypeByID(long ID)。从现在开始,每次创建UnitType对象时,都需要在Manager中进行注册(Manager具有将ID映射到对象的HashMap<Long, UnitType>)。

现在出现的问题是,在Java中我无法显式删除对象。我可以在Manager方法内的finalize()中取消注册该对象,但是由于对该对象的引用仍在Manager中,因此将永远不会调用finalize()

这使我在onDeleting()内编写了另一个方法UnitType,每次不再需要该对象时,应在C ++中将其称为delete。然后,onDeleting()方法将告诉Manager删除对该对象的引用。

在上面的示例中,我只提到了一个需要onDeleting()方法的类,但是说,我有一个完整的类层次结构,所有这些类都需要将自己序列化和反序列化为XML。

最后,我必须将onDeleting()方法添加到任何此类中,并确保在此方法中,任何成员变量都运行其onDeleting()等。现在看起来很像C ++,您将在指针上调用delete。这可能不是Java的方法。有没有其他选择?

最佳答案

实际上,这取决于您如何进行XML Java映射。如果使用JAXB,则可以使用@XmlID / @XmlIDRef。如果自己动手,请查看IdentityHashMap,然后仅生成反向引用。

10-05 21:13