XSTest.java: import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import com.thoughtworks.xstream.XStream; public class XSTest { private static final String XML_FILE = "c:\\temp\\items.xml"; private XStream xs; public XStream getXS() { if(xs == null) { xs = new XStream(); xs.processAnnotations(Store.class); xs.processAnnotations(Item.class); xs.processAnnotations(Weapon.class); xs.processAnnotations(Armor.class); } return xs; } public void createModel() { Store s = new Store(); s.items.add(new Weapon(1, "Short sword", "data/items/shortsword.png", "swords", "data/sprites/swordattack.png")); s.items.add(new Weapon(2, "Bastard sword", "data/items/bastardsword.png", "swords", "data/sprites/swordattack.png")); s.items.add(new Weapon(3, "Long sword", "data/items/longsword.png", "swords", "data/sprites/swordattack.png")); s.items.add(new Armor(4, "Studded leather armor", "data/items/studdedleather.png", "Chest", 20)); save(s, XML_FILE); } public Store loadStore() { XStream xs = getXS(); return (Store) xs.fromXML(new File(XML_FILE)); } public boolean save(Object obj, String location) { try { File f = new File(location); File dir = f.getParentFile(); if(!dir.exists()) dir.mkdirs(); XStream xs = getXS(); String xml = xs.toXML(obj); FileWriter fstream = new FileWriter(f); BufferedWriter out = new BufferedWriter(fstream); out.write(xml); out.close(); System.out.println(String.format("Generated xml '%s':\n%s", location, xml)); return true; } catch(Exception ex) { return false; } } public static void main(String[] args) { XSTest test = new XSTest(); test.createModel(); Store s = test.loadStore(); for(Item i : s.items) { System.out.println(i.toString()); } } } Store.java: import java.util.ArrayList; import com.thoughtworks.xstream.annotations.XStreamAlias; @XStreamAlias("store") public class Store { public ArrayList items; public Store() { items = new ArrayList(); } } Item.java: import com.thoughtworks.xstream.annotations.XStreamAlias; @XStreamAlias("item") public abstract class Item { public int id; public String name; public String inventorySheet; public Item() { } public Item(int id, String name, String inventorySheet) { this.id = id; this.name = name; this.inventorySheet = inventorySheet; } public abstract String getTypeName(); @Override public String toString() { return String.format("%s (%d): %s", getTypeName(), id, name); } } Armor.java: import com.thoughtworks.xstream.annotations.XStreamAlias; @XStreamAlias("armor") public class Armor extends Item{ public String armorType; public int armorValue; public Armor() { } public Armor(int id, String name, String sheet, String type, int value) { super(id, name, sheet); this.armorType = type; this.armorValue = value; } @Override public String getTypeName() { return "Armor"; } @Override public String toString() { return String.format("%s, type: %s, armor value: %d", super.toString(), armorType, armorValue); } } Weapon.java: import com.thoughtworks.xstream.annotations.XStreamAlias; @XStreamAlias("weapon") public class Weapon extends Item{ public String weaponType; public String attackSheet; public Weapon(){} public Weapon(int id, String name, String inventorySheet, String type, String attackSheet ) { super(id, name, inventorySheet); this.weaponType = type; this.attackSheet = attackSheet; } @Override public String getTypeName() { return "Weapon"; } @Override public String toString() { return String.format("%s, type: %s, attack sheet: %s", super.toString(), weaponType, attackSheet); } } The generated XML: 1 Short sword data/items/shortsword.png swords data/sprites/swordattack.png 2 Bastard sword data/items/bastardsword.png swords data/sprites/swordattack.png 3 Long sword data/items/longsword.png swords data/sprites/swordattack.png 4 Studded leather armor data/items/studdedleather.png Chest 20