Hi Tobias, it seems you're the first one who tries to serialize something like that. Please open a JIRA issue and I try to look into it in the next two weeks.
Cheers, Jörg Tobias Gierke wrote: > Hi, > > It seems we're not able to deserialize Lambda expressions with XStream > 1.4.7 > > The code in question looks roughly like this: > > @FunctionalInterface > public interface Visible extends Serializable { > public boolean isVisible(); > } > > public interface IMenuItem extends Serializable { > // ... stuff omitted ... > } > > public abstract class AbstractMenuItem implements IMenuItem { > private final Visible visibilityFunction; > // ... stuff omitted ... > } > > The method that is invoked with lambda expressions (that later get > stored in the 'visibilityFunction' field of an AbstractMenuItem subclass > instance) looks like this: > > public <T extends Page> void addEntry(String resourceLabel , Class<T> > pageClazz,Visible visibilityFunction); > > Since the Visible interface extends Serializable , the compiler > generates code for a serializable Lambda (and in fact it does, I checked > the generated .class file with javap). > > The code used to setup XStream looks like this: > > private XStream createXStream() > { > final XStream xstream = new XStream( new StaxDriver() ) { > @Override > protected MapperWrapper wrapMapper(MapperWrapper next) { > return new WicketProxyMapper( new CGLIBMapper( new > HibernateMapper(next) ) ); // > } > }; > > // override the built-in DynamicProxyConverter that chokes on > Apache Wicket proxies > xstream.registerConverter( new WicketProxyConverter() , > XStream.PRIORITY_VERY_HIGH ); > > // register Hibernate-specific converters > xstream.registerConverter(new HibernateProxyConverter()); > xstream.registerConverter(new > HibernatePersistentCollectionConverter(xstream.getMapper())); > xstream.registerConverter(new > HibernatePersistentMapConverter(xstream.getMapper())); > xstream.registerConverter(new > HibernatePersistentSortedMapConverter(xstream.getMapper())); > xstream.registerConverter(new > HibernatePersistentSortedSetConverter(xstream.getMapper())); > > // register CGLLib converters > xstream.registerConverter(new > CGLIBEnhancedConverter(xstream.getMapper(), > xstream.getReflectionProvider() , getClass().getClassLoader() ) ); > > return xstream; > } > > > Before I start diving into the world of invokedynamic and method handles > , did anybody else encounter this issue and knows how to solve it ? > > Cheers, > Tobias > > > com.thoughtworks.xstream.converters.ConversionException: > com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$$Lambda$124/1803727536 > : > com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$$Lambda$124/1803727536 > ---- Debugging information ---- > message : > com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$$Lambda$124/1803727536 > cause-exception : > com.thoughtworks.xstream.mapper.CannotResolveClassException > cause-message : > com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$$Lambda$124/1803727536 > class : > com.vodecc.voipmng.boundary.wicket.general.PageWithHeaderAndFooter$11 > required-type : > com.vodecc.voipmng.boundary.wicket.general.PageWithHeaderAndFooter$11 > converter-type : > com.thoughtworks.xstream.converters.reflection.ReflectionConverter > path : > /com.vodecc.voipmng.boundary.wicket.trunkmonitor.TrunkMonitorPage/children/com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$1/children/com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$1$1[2]/children/com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$SubMenuList/children/children/org.apache.wicket.markup.html.list.ListItem/children/children/com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$NestedListEntry$1/children/org.apache.wicket.markup.html.list.ListItem[3]/children/children/val$visibilityFunction > line number : 1 > class[1] : > com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$SimpleListEntry > class[2] : org.apache.wicket.markup.html.list.ListItem > class[3] : [Ljava.lang.Object; > converter-type[1] : > com.thoughtworks.xstream.converters.collections.ArrayConverter > class[4] : > com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$NestedListEntry$1 > class[5] : > com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$NestedListEntry > class[6] : > com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$SubMenuList$1 > class[7] : > com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$SubMenuList > class[8] : > com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$1$1 > class[9] : > com.vodecc.voipmng.boundary.wicket.general.PageWithMenu$1 > class[10] : > com.vodecc.voipmng.boundary.wicket.trunkmonitor.TrunkMonitorPage > version : not available > ------------------------------- > > > --------------------------------------------------------------------- > To unsubscribe from this list, please visit: > > http://xircles.codehaus.org/manage_email --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email