我正在编写一个游戏,它有一套规则,应该从 XML 文件加载或保存这些规则。
我有一个 UnitType 类,它可以对自身进行序列化和反序列化。 我还有一个可以加载/保存到 XML 的 Faction 类。 我有一个 Rules 类,其中包含
UnitType[] unitTypes;
Faction[] factions
加载规则时,我首先加载所有单元类型对象并将它们的引用存储到 unitTypes
中然后我加载 Factions 并将对它们的引用存储到 factions
中;
然而,Faction
类还有一个成员数组 UnitType[] accessibleUnitTypes
, 它显示了这个派系可以 build 的单位类型,我也需要加载它。
问题来了:因为引用只是一个地址,序列化它没有意义(在 Java 中也是不可能的),所以我需要创建一个特殊字段 long ID
在UnitType
里面类和一个特殊的 Manager 类,它有一个方法 getUnitTypeByID(long ID)
.从现在开始,每次我创建一个 UnitType
对象,我需要在 Manager
中注册它(Manager
有一个 HashMap<Long, UnitType>
将 ID 映射到对象)。
现在问题来了,在 java 中我不能显式删除对象。我可以从 Manager
注销对象在finalize()
里面方法,但由于对该对象的引用仍在 Manager
中, finalize()
永远不会被调用。
这让我写了另一个方法 onDeleting()
里面UnitType
,它应该被称为 delete
在 C++ 中,每次不再需要该对象时。 onDeleting()
然后方法会告诉 Manager
删除对该对象的引用。
在上面的示例中,我提到只有一个类需要 onDeleting()
方法,但是说,我有一个完整的类层次结构,它们都需要将自己序列化和反序列化为 XML。
我最终需要添加 onDeleting()
任何此类类的方法,并确保在此方法内任何成员变量运行其 onDeleting()
等等。这现在看起来很像 C++,您可以在 C++ 中对指针调用 delete。这可能不是执行此操作的 Java 方法。有其他选择吗?
最佳答案
这实际上取决于您如何进行 XML<->Java 映射。如果使用 JAXB,则可以使用 @XmlID/@XmlIDRef。如果您自己推出,请查看 IdentityHashMap,然后只生成反向引用。
关于java - 引用的 XML 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6245446/