2011-06-05 5 views
1

Je suis en train d'écrire un jeu qui a un ensemble de règles qui devraient être chargées ou enregistrées depuis/vers un fichier XML.Sérialisation XML des références

J'ai une classe UnitType qui peut se sérialiser et se désérialiser. J'ai aussi une classe Faction qui peut charger/enregistrer au format XML. Et j'ai un Règles classe qui contient

UnitType[] unitTypes; 
Faction[] factions 

Lors du chargement des règles, je suis charger tous les types d'unités les objets et stocker leurs références dans unitTypes Ensuite, je charge Factions et les références de magasin pour eux dans factions;

Cependant, la classe Faction a également un tableau de membres UnitType[] accessibleUnitTypes, qui indique les types d'unités que cette faction peut construire, et je dois également le charger.

vient ici le problème: car une référence est juste une adresse, sérialisation il n'a pas de sens (et est également impossible en Java), donc je dois créer un champ spécial long ID intérieur de la classe UnitType et un spécial directeur classe qui a une méthode getUnitTypeByID(long ID). A partir de maintenant, chaque fois que je crée un objet UnitType, je dois l'enregistrer dans le Manager (Manager a un HashMap<Long, UnitType> qui mappe les ID aux objets).

Maintenant vient le problème que dans Java, je ne peux pas supprimer explicitement des objets. Je peux désinscrire l'objet du Manager à l'intérieur de la méthode finalize() mais comme la référence à l'objet est toujours dans le Manager, finalize() ne sera jamais appelée.

Cela me fait écrire une autre méthode onDeleting() à l'intérieur UnitType, qui devrait être appelé comme delete en C++ chaque fois que l'objet n'est plus nécessaire. La méthode onDeleting() dira alors Manager pour supprimer la référence à l'objet.

Dans l'exemple ci-dessus, je n'ai mentionné qu'une seule classe ayant besoin de la méthode onDeleting(), mais disons que j'ai une hiérarchie complète de classes, et que toutes doivent se sérialiser et se désérialiser en XML.

Je finis avec la nécessité d'ajouter onDeleting() méthode à une telle classe, et assurez-vous que dans cette méthode toutes les variables sameber exécuter leur onDeleting() et ainsi de suite. Cela ressemble maintenant beaucoup à C++ où vous appelleriez supprimer sur les pointeurs. Ce n'est probablement pas la façon Java de le faire. Y a-t-il une alternative?

Répondre

2

Cela dépend en fait de la façon dont vous faites le mappage XML < -> Java. Si vous utilisez JAXB, vous pouvez utiliser @XmlID/@XmlIDRef. Si vous lancez la vôtre, regardez IdentityHashMap et générez simplement des références arrière.

+0

+1 - Pour plus d'informations sur @ XmlID/@ XmlIDREF consultez: http://bdoughan.blogspot.com/2010/10/jaxb-and- shared-references-xmlid-and.html –

+0

merci de votre aide! Je vais essayer ça – iseeall

1

Vous devriez utiliser l'une des nombreuses bibliothèques de sérialisation XML plutôt que d'essayer de résoudre tous ces problèmes encore une fois pour vous-même, et croyez-moi que vous ne les avez pas encore tous trouvés. Java.beans.XMLEncoder, XML Beans, JAXB, ...