2011-06-05 47 views
1

我正在写一个游戏,它有一套应该从/到XML文件中加载或保存的规则。参考文献的XML序列化

我有一个单元类型类可以序列化和反序列化自己。 我也有一个派系类可以加载/保存到XML。 和我有一个规则类,其中包含

UnitType[] unitTypes; 
Faction[] factions 

当装载规则,我第一次加载所有单位类型对象及其引用存储到unitTypes然后我加载派别和商店对它们的引用到factions;

但是,Faction类也有一个成员数组UnitType[] accessibleUnitTypes,该成员数组显示此派别可以构建哪些单位类型,并且我也需要加载它。

这里谈到的问题:既然一提的是只是一个地址,序列化是没有意义的(并且也不可能在Java中),所以我需要创建UnitType类中的特殊领域long ID和特殊经理类有一个方法getUnitTypeByID(long ID)。从现在开始,每当我创建一个对象时,我需要在ManagerManager有一个HashMap<Long, UnitType>,它将ID映射到对象)内注册它。

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

这让我写了onDeleting()里面的另一种方法UnitType,每当不再需要对象时,应该在C++中调用它,就像delete一样。 onDeleting()方法会告诉Manager删除对象的引用。

在上面的例子中,我只提到了一个需要onDeleting()方法的类,但是说,我有一个类的整体层次,并且他们都需要序列化和反序列化为XML。

我最终需要将onDeleting()方法添加到任何这样的类中,并确保在此方法内部的任何memeber变量运行它们的onDeleting()等等。现在看起来很像C++,你可以在指针上调用delete。这可能不是Java的方式来做到这一点。有其他选择吗?

回答

2

它实际上取决于你如何做XML < - > Java映射。如果您使用JAXB,则可以使用@XmlID/@XmlIDRef。如果您推出自己的产品,请查看IdentityHashMap,然后生成反向引用。

+0

+1 - 有关@ XmlID/@ XmlIDREF的更多信息,请查看:http://bdoughan.blogspot.com/2010/10/jaxb-and- shared-references-xmlid-and.html – 2011-06-05 21:34:26

+0

感谢您的帮助!会试试这个 – iseeall 2011-06-05 23:07:57

1

您应该使用许多XML序列化库中的一个,而不是试图自己解决所有这些问题,并且相信我还没有找到它们。 Java.beans.XMLEncoder,XML Beans,JAXB,...