Problems when deserializing my serialized data

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Problems when deserializing my serialized data

Dirk Schnelle-Walka
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.

Any help is welcome,
Dirk



---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Problems when deserializing my serialized data

Jörg Schaible-2
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


Reply | Threaded
Open this post in threaded view
|

Re: Problems when deserializing my serialized data

Dirk Schnelle-Walka
Hey Jörg,

thanks for the quick answer. I wrote a unit test and it worked for me as
well. Now, I digged into it and found the reason for this strange
behavior. I had another class that was used prior to the array container
for primitives annotated with @XStreamAlias("short").

So, I assume that this changed the way, how short primitives were
handled in general. I changed it to @XStreamAlias("shortprimitive") and
it worked.

Thanks again,
Dirk

On Wed, 2013-10-23 at 20:05 +0200, Jörg Schaible wrote:

> 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
>
>



---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: Re: Problems when deserializing my serialized data

Jörg Schaible-3
Hi Dirk,

Dirk Schnelle-Walka wrote:

> Hey Jörg,
>
> thanks for the quick answer. I wrote a unit test and it worked for me as
> well. Now, I digged into it and found the reason for this strange
> behavior. I had another class that was used prior to the array container
> for primitives annotated with @XStreamAlias("short").
>
> So, I assume that this changed the way, how short primitives were
> handled in general. I changed it to @XStreamAlias("shortprimitive") and
> it worked.

XStream sets up quite some aliases for the types it handles (see code of
XStream.setupAliases()). Normally you have a 1:1 relation between alias and
type, but you can define 1:N. At marshalling time multiple types will be
represented then with the same alias (this is what XStream.aliasType does
for a type hierarchy), but at unmarshalling time the last definition is used
to "convert" from the alias to the type again.

Regards,
Jörg



---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email