1616import java .io .InputStream ;
1717import java .io .PrintWriter ;
1818import java .lang .reflect .Constructor ;
19+ import java .lang .reflect .Field ;
1920import java .lang .reflect .InvocationTargetException ;
21+ import java .lang .reflect .Modifier ;
2022import java .net .URLDecoder ;
23+ import java .util .Arrays ;
2124import java .util .Date ;
2225import java .util .Enumeration ;
2326import java .util .HashSet ;
@@ -265,8 +268,29 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp)
265268//resp.setCharacterEncoding("utf-8");
266269PrintWriter writer =resp .getWriter ();
267270runnable .deserialize (request );
271+ SimpleRPCRunnable clonedRunnable =null ;
272+ try {
273+ clonedRunnable = (SimpleRPCRunnable )runnable .clone ();
274+ }catch (CloneNotSupportedException e ) {
275+ //e.printStackTrace();
276+ }
268277runnable .ajaxRun ();
269- writer .write (runnable .serialize ());
278+ final String []diffs =compareDiffs (runnable ,clonedRunnable );
279+ String serialize =runnable .serialize (new SimpleFieldFilter () {
280+
281+ public boolean filter (String field ) {
282+ if (diffs ==null ||diffs .length ==0 )return true ;
283+ for (int i =0 ;i <diffs .length ;i ++) {
284+ if (diffs [i ].equals (field )) {
285+ return false ;
286+ }
287+ }
288+ return true ;
289+ }
290+
291+ });
292+
293+ writer .write (serialize );
270294}
271295
272296protected void doGet (HttpServletRequest req ,HttpServletResponse resp )
@@ -311,8 +335,27 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
311335return ;
312336}
313337runnable .deserialize (request );
338+ SimpleRPCRunnable clonedRunnable =null ;
339+ try {
340+ clonedRunnable = (SimpleRPCRunnable )runnable .clone ();
341+ }catch (CloneNotSupportedException e ) {
342+ //e.printStackTrace();
343+ }
314344runnable .ajaxRun ();
315- String serialize =runnable .serialize ();
345+ final String []diffs =compareDiffs (runnable ,clonedRunnable );
346+ String serialize =runnable .serialize (new SimpleFieldFilter () {
347+
348+ public boolean filter (String field ) {
349+ if (diffs ==null ||diffs .length ==0 )return true ;
350+ for (int i =0 ;i <diffs .length ;i ++) {
351+ if (diffs [i ].equals (field )) {
352+ return false ;
353+ }
354+ }
355+ return true ;
356+ }
357+
358+ });
316359
317360if (isScriptReuest ) {// cross site script response
318361resp .setContentType ("text/javascript" );
@@ -461,4 +504,94 @@ private void cleanSession(HttpSession ses) {
461504}
462505}
463506
507+ protected String []compareDiffs (SimpleRPCRunnable runnable1 ,SimpleRPCRunnable runnable2 ) {
508+ Set diffSet =new HashSet ();
509+ Set fieldSet =new HashSet ();
510+ Class clazz =runnable1 .getClass ();
511+ while (clazz !=null && !"net.sf.j2s.ajax.SimpleSerializable" .equals (clazz .getName ())) {
512+ Field []fields =clazz .getDeclaredFields ();
513+ for (int i =0 ;i <fields .length ;i ++) {
514+ fieldSet .add (fields [i ]);
515+ }
516+ clazz =clazz .getSuperclass ();
517+ }
518+ Field []fields = (Field [])fieldSet .toArray (new Field [0 ]);
519+ for (int i =0 ;i <fields .length ;i ++) {
520+ Field field =fields [i ];
521+ int modifiers =field .getModifiers ();
522+ if ((modifiers & (Modifier .PUBLIC |Modifier .PROTECTED )) !=0
523+ && (modifiers &Modifier .TRANSIENT ) ==0
524+ && (modifiers &Modifier .STATIC ) ==0 ) {
525+ String name =field .getName ();
526+ Object field1 =null ;
527+ try {
528+ field1 =field .get (runnable1 );
529+ }catch (IllegalArgumentException e1 ) {
530+ //e1.printStackTrace();
531+ }catch (IllegalAccessException e1 ) {
532+ //e1.printStackTrace();
533+ }
534+ Object field2 =null ;
535+ try {
536+ field2 =field .get (runnable2 );
537+ }catch (IllegalArgumentException e ) {
538+ //e.printStackTrace();
539+ }catch (IllegalAccessException e ) {
540+ //e.printStackTrace();
541+ }
542+ System .out .println (field1 .getClass ().getName ());
543+ if (field1 ==null ) {
544+ if (field2 !=null ) {
545+ diffSet .add (name );
546+ }
547+ }else if (field1 .getClass ().getName ().startsWith ("[" )) {
548+ Class type =field .getType ();
549+ if (type ==float [].class ) {
550+ if (!Arrays .equals ((float [])field1 , (float [])field2 )) {
551+ diffSet .add (name );
552+ }
553+ }else if (type ==double [].class ) {
554+ if (!Arrays .equals ((double [])field1 , (double [])field2 )) {
555+ diffSet .add (name );
556+ }
557+ }else if (type ==int [].class ) {
558+ if (!Arrays .equals ((int [])field1 , (int [])field2 )) {
559+ diffSet .add (name );
560+ }
561+ }else if (type ==long [].class ) {
562+ if (!Arrays .equals ((long [])field1 , (long [])field2 )) {
563+ diffSet .add (name );
564+ }
565+ }else if (type ==short [].class ) {
566+ if (!Arrays .equals ((short [])field1 , (short [])field2 )) {
567+ diffSet .add (name );
568+ }
569+ }else if (type ==byte [].class ) {
570+ if (!Arrays .equals ((byte [])field1 , (byte [])field2 )) {
571+ diffSet .add (name );
572+ }
573+ }else if (type ==char [].class ) {
574+ if (!Arrays .equals ((char [])field1 , (char [])field2 )) {
575+ diffSet .add (name );
576+ }
577+ }else if (type ==boolean [].class ) {
578+ if (!Arrays .equals ((boolean [])field1 , (boolean [])field2 )) {
579+ diffSet .add (name );
580+ }
581+ }else if (type ==String [].class ) {
582+ if (!Arrays .equals ((String [])field1 , (String [])field2 )) {
583+ diffSet .add (name );
584+ }
585+ }else if (type ==Object [].class ) {
586+ if (!Arrays .equals ((Object [])field1 , (Object [])field2 )) {
587+ diffSet .add (name );
588+ }
589+ }
590+ }else if (!field1 .equals (field2 )) {
591+ diffSet .add (name );
592+ }
593+ }
594+ }
595+ return (String [])diffSet .toArray (new String [diffSet .size ()]);
596+ }
464597}