java - 引用的 XML 序列化

标签 java xml serialization reference

我正在编写一个游戏,它有一套规则,应该从 XML 文件加载或保存这些规则。

我有一个 UnitType 类,它可以对自身进行序列化和反序列化。 我还有一个可以加载/保存到 XML 的 Faction 类。 我有一个 Rules 类,其中包含

UnitType[] unitTypes;
Faction[] factions

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

然而,Faction类还有一个成员数组 UnitType[] accessibleUnitTypes , 它显示了这个派系可以 build 的单位类型,我也需要加载它。

问题来了:因为引用只是一个地址,序列化它没有意义(在 Java 中也是不可能的),所以我需要创建一个特殊字段 long IDUnitType里面类和一个特殊的 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/

相关文章:

php - 在 php 中使用序列化将关联数组存储在数据库中

Java Jackson 如何在序列化过程中解开原始值?

Java:writeObject 与 writeExternal 的效率

构造函数中的Java调用 setter

java - JSF 或 PrimeFaces 可搜索 TreeView 控件

java - 定时器不允许用户编辑

Android 在使用 cardview 图像时加载非常懒惰

c# - 为什么这个 linq 查询只返回第一个属性?

java - 静态 valueOf() 方法有什么意义? (枚举)

java - 创建变量来保存对象有时是多余的吗?