Hi Amit,
Amit Basu wrote:
>
> I have a container class as follows:
> class FruitBasket { List<Apple> apples; List<Orange> oranges;}
> I have added xstream.registerConverter(new
> HibernatePersistentCollectionConverter(xstream.getMapper()));
You should also setup the HibernateMapper and the HibernateProxyConverter.
> I have also
> setup alias apple for com.myorg.Apple and com.myorg.Orange. The marshalled
> FruitBasket object has:
> <apples class="list"> <apple>....</apple>
> <apple>....</apple></apples><oranges class="list"> <orange>....</orange>
> <orange>....</orange></oranges> In order to get rid of the class="list" in
> apples and oranges, I added xstream.alias("apples", List.class,
> PersistentList.class);xstream.alias("oranges", List.class,
> PersistentList.class);
A call to
xstream.alias(name, type, defaultType)
is only a shortcut for
xstream.alias(name, type)
xstream.defaultImplementation(type, defaultType)
So what you effectively have defined is
1/ List.class should no longer be named "list", but "apples" now
2/ For serialization use every time the type List.class if a
PersistentList.class is used; for deserialization use everytime a
PersistentList.class if a List.class occurs
3/ List.class should no longer be named "apples", but "oranges" now;
actually clobbering (1)
4/ Repeat definition of (2)
> The objects are marshalled all right, without the
> class= attributes. But the client unmarshals, and fails with
> com.thoughtworks.xstream.mapper.CannotResolveClassException: oranges If I
> change the order of aliasing with oranges first instead of
> apples:xstream.alias("oranges", List.class,
> PersistentList.class);xstream.alias("apples", List.class,
> PersistentList.class); then the CannotResolveClassException comes for
> apples.
As said, they are clobbering each other. Additionally the alias definition
is completely useless, since the names of the elements of FruitBasket are
derived from the name of the fields and not from the type of the objects
that are present in the field.
> Seems like at most one collection of the same interface type (List
> in this case) is end-to-end marshalled / unmarshalled all right for the
> FruitBasket container class. I would like to know if there is a way around
> the problem.
Stays the call to defaultImplementation. As explained, the current
definition is problematic, because at deserialization time it will try to
instantiate a PersistentList. You may use the following sequence:
xstream.defaultIMplementation(List.class, PersistentList.class);
xstream.defaultIMplementation(List.class, ArrayList.class);
The second call will actuall clobber the definition for deserialization.
Cheers,
Jörg
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email