Hi Tobias,
Tobias Gierke wrote:
[snip]
> Thanks for your quick response ! We changed too many things
> unfortunately :/ We upgraded from XStream 1.4.3 to 1.4.8 because of the
> JDK8 fixes and at the same time also did a lot of changes to our
> application.
>
> I just managed to "fix" the issue by changing the priorities and set of
> converters I registered like so:
>
> ========== 1.4.3 =========
>
> final XStream xstream = new XStream( new StaxDriver() ) {
> @Override
> protected MapperWrapper wrapMapper(MapperWrapper next) {
> return new WicketProxyMapper( new CGLIBMapper( new
> HibernateMapper(next) ) );
> }
> };
>
> xstream.registerConverter( new WicketProxyConverter() ,
> XStream.PRIORITY_VERY_HIGH );
> xstream.registerConverter( new EnumConverter() ,
> XStream.PRIORITY_VERY_HIGH );
> xstream.registerConverter(new
> HibernatePersistentCollectionConverter(xstream.getMapper()) ,
> XStream.PRIORITY_VERY_HIGH );
> xstream.registerConverter(new
> HibernatePersistentMapConverter(xstream.getMapper()) ,
> XStream.PRIORITY_VERY_HIGH );
> xstream.registerConverter(new
> HibernatePersistentSortedMapConverter(xstream.getMapper()) ,
> XStream.PRIORITY_VERY_HIGH );
> xstream.registerConverter(new
> HibernatePersistentSortedSetConverter(xstream.getMapper()) ,
> XStream.PRIORITY_VERY_HIGH );
> xstream.registerConverter(new HibernateProxyConverter() ,
> XStream.PRIORITY_VERY_HIGH );
> xstream.registerConverter(new
> CGLIBEnhancedConverter(xstream.getMapper(),
> xstream.getReflectionProvider() , getClass().getClassLoader() ) );
> xstream.registerConverter( new
> SerializableConverter(xstream.getMapper(),
> xstream.getReflectionProvider() , getClass().getClassLoader() ) );
>
>
> ========== 1.4.8 =========
>
> final XStream xstream = new XStream( new StaxDriver() ) {
> @Override
> protected MapperWrapper wrapMapper(MapperWrapper next) {
> return new WicketProxyMapper( new CGLIBMapper( new
> HibernateMapper(next) ) );
> }
> };
>
> xstream.registerConverter( new WicketProxyConverter() ,
> XStream.PRIORITY_VERY_HIGH );
> xstream.registerConverter(new
> HibernatePersistentCollectionConverter(xstream.getMapper()) );
> xstream.registerConverter(new
> HibernatePersistentMapConverter(xstream.getMapper()) );
> xstream.registerConverter(new
> HibernatePersistentSortedMapConverter(xstream.getMapper()) );
> xstream.registerConverter(new
> HibernatePersistentSortedSetConverter(xstream.getMapper()) );
> xstream.registerConverter(new HibernateProxyConverter() );
> xstream.registerConverter(new
> CGLIBEnhancedConverter(xstream.getMapper(),
> xstream.getReflectionProvider() , getClass().getClassLoader() ) );
>
> It *seems* like the issue was caused by an interesting interaction
> between the converters but I admit I know far too much about XStreams
> inner workings to make sense of this.
The most problematic action was/is the registration of the
SerializationConverter with normal priority. That will prefer it over any
other converter with same priority (see default priority in
http://xstream.codehaus.org/converters.html) i.e. any Serializable with a
readObject/writeObject method will now be handled by the generic
SerializationConverter instead of the more specialized one (e.g. the
CollectionConverter for a HashSet).
Try yourself:
HashSet<String> hs = new HashSet<>();
hs.add("test");
XStream xstream = new XStream();
xstream.registerConverter(
new SerializableConverter(xstream.getMapper(),
xstream.getReflectionProvider(), xstream.getClassLoaderReference()));
System.out.Println(xstream.toXML(hs));
System.out.Println(new XStream().toXML(hs)); // vanilla instance
That should make a difference.
Cheers,
Jörg
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email