Details
Description
A nested class cannot be serialized by XStream 1.4.5 in Oracle JDK8 Early Access Build b108.
Code sample:
public class OrderRetainingMapTest {
private static class Class1 implements Serializable {
private final int fValue1;
private Class1(int value1)
{ fValue1 = value1; } @Override
public String toString()
}
private static class Class2 extends Class1 {
private final int fValue2;
protected Class2(int value1, int value2)
{ super(value1); fValue2 = value2; } @Override
public String toString()
}
private static final class Class3 extends Class2 {
private final int fValue3;
private Class3(int value1, int value2, int value3)
{ super(value1, value2); fValue3 = value3; } @Override
public String toString()
}
@Test
public void testXStreamClass3ToXml()
}
causes
java.lang.ArrayIndexOutOfBoundsException: -1
at com.thoughtworks.xstream.core.util.OrderRetainingMap.entrySet(OrderRetainingMap.java:77)
at java.util.HashMap.putMapEntries(HashMap.java:511)
at java.util.HashMap.putAll(HashMap.java:784)
at com.thoughtworks.xstream.core.util.OrderRetainingMap.<init>(OrderRetainingMap.java:36)
at com.thoughtworks.xstream.converters.reflection.FieldDictionary.buildMap(FieldDictionary.java:135)
at com.thoughtworks.xstream.converters.reflection.FieldDictionary.fieldsFor(FieldDictionary.java:76)
at com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider.visitSerializableFields(PureJavaReflectionProvider.java:127)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doMarshal(AbstractReflectionConverter.java:83)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshal(AbstractReflectionConverter.java:73)
at com.thoughtworks.xstream.core.AbstractReferenceMarshaller.convert(AbstractReferenceMarshaller.java:69)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:58)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:43)
at com.thoughtworks.xstream.core.TreeMarshaller.start(TreeMarshaller.java:82)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.marshal(AbstractTreeMarshallingStrategy.java:37)
at com.thoughtworks.xstream.XStream.marshal(XStream.java:993)
at com.thoughtworks.xstream.XStream.marshal(XStream.java:982)
at com.thoughtworks.xstream.XStream.toXML(XStream.java:955)
at com.thoughtworks.xstream.XStream.toXML(XStream.java:942)
at com.thoughtworks.xstream.OrderRetainingMapTest.testXStreamClass3ToXml(OrderRetainingMapTest.java:69)
It seems that the HashMap#putAll(Map) call in the constructor of OrderRetainingMap with map parameter
public class OrderRetainingMap extends HashMap {
...
public OrderRetainingMap(Map m)
...
}
is no more compatible with the HashMap implementation.
Potential fixes:
1) define putAll(Map) in OrderRetainingMap
public void putAll(Map m) {
for (Entry e : m.entrySet())
}
or
2) subclass LinkedHashMap
public class OrderRetainingMap extends LinkedHashMap {
public OrderRetainingMap()
public OrderRetainingMap(Map m)
{ super(m); }}
or
3) use LinkedHashMap instead of OrderRetainingMap, drop OrderRetainingMap
The same problem seems to occur with IBM SDK, see http://jira.codehaus.org/browse/XSTR-739.
Issue Links
- duplicates
-
XSTR-739 Index out of bounds error causes xstream 1.4.4 to fail on AIX 7.1 using IBM 32-bit SDK for AIX, Version 6
That was fine with older b77 though ...