我正在编写一个游戏,游戏具有一组应从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,然后仅生成反向引用。