Hi Geoffrey, Geoffrey De Smet wrote:
> How do I model a singleton field of a supertype of several types with > different element names? > > > I have these classes: > > @XStreamAlias("house") > public class House { > > @XStreamImplicit() > private List<Animal> animalList; > > } > > @XStreamInclude({Dog.class, Cat.class}) > public abstract class Animal {} > > @XStreamAlias("dog") > public class Dog extends Animal {} > > @XStreamAlias("cat") > public class Cat extends Animal {} > > so I can write: > > <house> > <dog/> > <dog/> > <cat/> > </house> > > and the animalList of House is filled with 2 dogs and a cat. > This works well. > > > Now I want to be able to do support an xml like this: > <cage> > <dog/> > </cage> > or > <cage> > <cat/> > </cage> > > and a class diagram that doesn't use a List<Animal> field, but just a > field Animal: > > @XStreamAlias("cage") > public class Cage { > > @XStreamImplicit() > private Animal animal; > > } > > But that doesn't work. Implicit declaration is only meaningful for List, Map or Array types. > How can I make that work? Not by configuration. The Cage member will alway be named 'animal'. An alias cannot do, since it maps only the name of the member ... you want to map the member instance's type. > Without changing the XML schema. > Currently I am working around by using an List<Animal> anyway, > and adding validation that it's a singleton list... but that's undesired. Create a custom converter for Cage and write the XML tag yourself using the Animal's real type. If you provide the current Mapper as constructor argument. you can lookup the aliases for Dog.class and Cat.class. See the example at the end of the converter-tutorial, how you can pass the marshalling of the member itself again to XStream. Cheers, Jörg --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email