Hi Dirk,
Dirk Schnelle-Walka wrote:
> Hey there,
>
> currently, I am evaluating XStream and ran into some problems with it. I
> serialized the following data container:
>
> package data;
>
> @XStreamAlias("shortarray")
> public class ShortArrayContainer {
> @XStreamAsAttribute
> public short[] values;
> }
>
> This serializes into something like (using stream.toXML(container,
> out)):
>
> <shortarray>
> <values>
> <short>16383</short>
> <short>16384</short>
> <short>16385</short>
> <short>16386</short>
> <short>16387</short>
> </values>
> </shortarray>
>
> stream is initialized with
> stream = new XStream(new DomDriver("UTF-8"));
> stream.autodetectAnnotations(true);
>
> Unfortunately, I get a ConversionException, when I try to deserialize
> with stream.fromXML(in):
>
> com.thoughtworks.xstream.converters.ConversionException: array element
> type mismatch : array element type mismatch
> ---- Debugging information ----
> message : array element type mismatch
> cause-exception : java.lang.IllegalArgumentException
> cause-message : array element type mismatch
> class : [Ljava.lang.Short;
> required-type : [Ljava.lang.Short;
> converter-type :
> com.thoughtworks.xstream.converters.collections.ArrayConverter
> path : /shortobjectarray/values
> class[1] : data.ShortObjectArrayContainer
> converter-type[1] :
> com.thoughtworks.xstream.converters.reflection.ReflectionConverter
> version : 1.4.5
> -------------------------------
>
> Interestingly, I observed no problems when I am doing this with byte or
> boolean arrays.
>
> I already tried playing around with Short vs short and List instead of
> arrays without much success.
================== %< =======================
@XStreamAlias("shortarray")
public static class ShortArrayContainer {
public short[] values;
@Override
public int hashCode() {
return Arrays.hashCode(values);
}
@Override
public boolean equals(Object obj) {
return Arrays.equals(values, ((ShortArrayContainer)obj).values);
}
}
public void testShortArray() {
XStream xstream = new XStream();
xstream.processAnnotations(ShortArrayContainer.class);
ShortArrayContainer container = new ShortArrayContainer();
container.values = new short[]{ 42, 4711, 16383, 16384, 16385 };
String xml = ""
+ "<shortarray>\n"
+ " <values>\n"
+ " <short>42</short>\n"
+ " <short>4711</short>\n"
+ " <short>16383</short>\n"
+ " <short>16384</short>\n"
+ " <short>16385</short>\n"
+ " </values>\n"
+ "</shortarray>";
assertEquals(container, xstream.fromXML(xml));
}
================== %< =======================
Works for me. You will have to provide an actually failing unit test.
Two comments (both are also in the FAQ):
1/ Auto-detection cannot work for the root object at deserialization:
http://xstream.codehaus.org/annotations-tutorial.html#AutoDetect
2/ @XStreamAsAttribute is simple ignored if the converter implementation is
not a SingleValueConverter, i.e. the object to convert (here a short array)
cannot be represented by the converter as a single string - a precondition
for an XML attribute.
Cheers,
Jörg
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email