maybe a new RPC Serialization/DeSerialization error..

3 views
Skip to first unread message

guru...@gmail.com

unread,
Aug 9, 2006, 8:12:13 AM8/9/06
to Google Web Toolkit
It's seems to me that i've found another strain of serialization bug
that happen in hosted mode only. I'ts working ok with compiled code..
but i'ts a mess do deveop this way...

i have proxy classes going up and down via RPC shaped like this..

public class BaseProxy implements IsSerializable {
public Long id=null;
public boolean isnew=false;
}

public class BoxProxy extends BaseProxy implements Comparable,
Orderable {

public String name;
public String title;
public int ordering;
public TemplateProxy template;
public ImageProxy image;
public BoxLinkProxy[] boxLinks;
public NewsProxy[] newses;
..

public class NewsProxy extends BaseProxy implements
Comparable,Orderable{
public int type=0;
public String name;
public String title;
public String text;
public Date newsDate=new Date();
public Date publishDate=new Date();
public Date expireDate;
public ImageProxy image;
public int ordering;
public TemplateProxy template;
...

public class TemplateProxy extends BaseProxy {
public transient static final int MENU=3;
public transient static final int NEWS=2;
public transient static final int BOX=1;

public String name;
public String description;
public int type;
public String fileName;
public boolean fundamental=false;
}

basically it's simple object containg reference to other proxy object
for one to one associaton, arrays of proxy object for one to many and
simple entity for fields..
everything is automatically transformed from and to hiberate object
via reflection and annotation on the server portion of the apps..
it's works well and it's easy to handle..

now the problem..

1) i do a query server side and create an array of proxy object
containing array of other object, containing again array of proxy
object..... let's say a array of BoxProxy containing an array of
NewsProxy containing an instance of TemplateProxy...

2) RPC tranfer all this correctly to the client side, and everithing
end's up displayed correctly...

3) i now try to resend vi RPC everything back to the server, and even
if i made no modification to the object graph, i got

13:53:25,885 ERROR [/pcmsGui]:667 - Exception while dispatching
incoming RPC call
com.google.gwt.user.client.rpc.SerializationException:
java.lang.reflect.InvocationTargetException
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserizeWithCustomSerializer(ServerSerializationStream.java:595)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserialize(ServerSerializationStream.java:518)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.readObject(ServerSerializationStream.java:445)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserializeValue(ServerSerializationStream.java:413)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserializeClass(ServerSerializationStream.java:470)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserialize(ServerSerializationStream.java:525)
at com.

Caused by: com.google.gwt.user.client.rpc.SerializationException:
java.lang.reflect.InvocationTargetException
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserizeWithCustomSerializer(ServerSerializationStream.java:595)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserialize(ServerSerializationStream.java:518)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.readObject(ServerSerializationStream.java:445)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserializeValue(ServerSerializationStream.java:413)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserializeClass(ServerSerializationStream.java:470)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserialize(ServerSerializationStream.java:525)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.readObject(ServerSerializationStream.java:445)
at
com.google.gwt.user.client.rpc.core.java.lang.Object_Array_CustomFieldSerializer.deserialize(Object_Array_CustomFieldSerializer.java:41)
... 33 more

Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserizeWithCustomSerializer(ServerSerializationStream.java:578)
... 40 more
Caused by: java.lang.IllegalArgumentException
at
sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63)
at java.lang.reflect.Field.set(Field.java:656)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserializeClass(ServerSerializationStream.java:476)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserialize(ServerSerializationStream.java:525)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.readObject(ServerSerializationStream.java:445)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserializeValue(ServerSerializationStream.java:413)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserializeClass(ServerSerializationStream.java:470)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserialize(ServerSerializationStream.java:525)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.readObject(ServerSerializationStream.java:445)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserializeValue(ServerSerializationStream.java:413)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserializeClass(ServerSerializationStream.java:470)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserialize(ServerSerializationStream.java:525)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.readObject(ServerSerializationStream.java:445)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserializeValue(ServerSerializationStream.java:413)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserializeClass(ServerSerializationStream.java:470)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.deserialize(ServerSerializationStream.java:525)
at
com.google.gwt.user.server.rpc.ServerSerializationStream.readObject(ServerSerializationStream.java:445)
at
com.google.gwt.user.client.rpc.core.java.lang.Object_Array_CustomFieldSerializer.deserialize(Object_Array_CustomFieldSerializer.java:41)
... 45 more


trying to understand what is happening i modified
ServerSerializationStream class adding some quick and dirty debug
message (good old pratice...) this way around line 472..in
deserializeClass method :

// Supress access restrictions
boolean isAccessible = declField.isAccessible();
declField.setAccessible(true);

Object value = deserializeValue(declField.getType());

if (instance != null)
System.out.println("EMERG DEBUG FIELD "+ declField.toString()+ "
OF INSTANCE : "+instance.toString());
if (value != null )
System.out.println ("EMERG DEBUG TO GET "+
value.getClass().toString()+ " VALUE : "+value.toString());
declField.set(instance, value);

// Restore access restrictions
declField.setAccessible(isAccessible);
}


the result is this... deserializer start do deserialize the stream at
one point it's create a NewsProxy object, correctly deserialize some
field, then found a TeplateProxy object, correctrly (recusively i
think) deserialize that, then go on with other field in the NewsProxy
object and SKIP OR TAKE A FIELD OUT OF ORDER endig up trying to put a
Long inside a String.

here are a debug log of that mess...

EMERG DEBUG FIELD public java.util.Date
solo.pcmsGui.client.proxy.NewsProxy.expireDate OF INSTANCE :
solo.pcmsGui.client.proxy.NewsProxy@1880543
EMERG DEBUG FIELD public solo.pcmsGui.client.proxy.ImageProxy
solo.pcmsGui.client.proxy.NewsProxy.image OF INSTANCE :
solo.pcmsGui.client.proxy.NewsProxy@1880543
EMERG DEBUG FIELD public java.lang.String
solo.pcmsGui.client.proxy.NewsProxy.name OF INSTANCE :
solo.pcmsGui.client.proxy.NewsProxy@1880543
EMERG DEBUG TO GET class java.lang.String VALUE : infomutuograduato
EMERG DEBUG FIELD public java.util.Date
solo.pcmsGui.client.proxy.NewsProxy.newsDate OF INSTANCE :
solo.pcmsGui.client.proxy.NewsProxy@1880543
EMERG DEBUG FIELD public int
solo.pcmsGui.client.proxy.NewsProxy.ordering OF INSTANCE :
solo.pcmsGui.client.proxy.NewsProxy@1880543
EMERG DEBUG TO GET class java.lang.Integer VALUE : 10
EMERG DEBUG FIELD public java.util.Date
solo.pcmsGui.client.proxy.NewsProxy.publishDate OF INSTANCE :
solo.pcmsGui.client.proxy.NewsProxy@1880543
EMERG DEBUG FIELD public java.lang.String
solo.pcmsGui.client.proxy.TemplateProxy.description OF INSTANCE :
solo.pcmsGui.client.proxy.TemplateProxy@1117cc0
EMERG DEBUG TO GET class java.lang.String VALUE : Left image news
EMERG DEBUG FIELD public java.lang.String
solo.pcmsGui.client.proxy.TemplateProxy.fileName OF INSTANCE :
solo.pcmsGui.client.proxy.TemplateProxy@1117cc0
EMERG DEBUG TO GET class java.lang.String VALUE :
WEB-INF/templates/news/leftimage.jsp
EMERG DEBUG FIELD public boolean
solo.pcmsGui.client.proxy.TemplateProxy.fundamental OF INSTANCE :
solo.pcmsGui.client.proxy.TemplateProxy@1117cc0
EMERG DEBUG TO GET class java.lang.Boolean VALUE : true
EMERG DEBUG FIELD public java.lang.String
solo.pcmsGui.client.proxy.TemplateProxy.name OF INSTANCE :
solo.pcmsGui.client.proxy.TemplateProxy@1117cc0
EMERG DEBUG TO GET class java.lang.String VALUE : leftimage
EMERG DEBUG FIELD public int
solo.pcmsGui.client.proxy.TemplateProxy.type OF INSTANCE :
solo.pcmsGui.client.proxy.TemplateProxy@1117cc0
EMERG DEBUG TO GET class java.lang.Integer VALUE : 2
EMERG DEBUG FIELD public java.lang.Long
solo.pcmsGui.client.proxy.BaseProxy.id OF INSTANCE :
solo.pcmsGui.client.proxy.TemplateProxy@1117cc0
EMERG DEBUG TO GET class java.lang.Long VALUE : 8
EMERG DEBUG FIELD public boolean
solo.pcmsGui.client.proxy.BaseProxy.isnew OF INSTANCE :
solo.pcmsGui.client.proxy.TemplateProxy@1117cc0
EMERG DEBUG TO GET class java.lang.Boolean VALUE : false
EMERG DEBUG FIELD public solo.pcmsGui.client.proxy.TemplateProxy
solo.pcmsGui.client.proxy.NewsProxy.template OF INSTANCE :
solo.pcmsGui.client.proxy.NewsProxy@1880543
EMERG DEBUG TO GET class solo.pcmsGui.client.proxy.TemplateProxy VALUE
: solo.pcmsGui.client.proxy.TemplateProxy@1117cc0

until here all ok...

EMERG DEBUG FIELD public java.lang.String
solo.pcmsGui.client.proxy.NewsProxy.text OF INSTANCE :
solo.pcmsGui.client.proxy.NewsProxy@1880543
EMERG DEBUG TO GET class java.lang.String VALUE : Informazioni sul
Mutuo Graduato

but this is WRONG... text field in the object does contain DIFFERENT
TEXT...

EMERG DEBUG FIELD public java.lang.String
solo.pcmsGui.client.proxy.NewsProxy.title OF INSTANCE :
solo.pcmsGui.client.proxy.NewsProxy@1880543
EMERG DEBUG TO GET class java.lang.Long VALUE : 1

this too is WRONG.. deserializer is trying to put a Long inside a
STRING !!!

hope is clear...
ciao
Luca Sacchi

Reply all
Reply to author
Forward
0 new messages