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


Reply via email to