Check for @GwtTransient annotation when checking for transient fields in the RPC subsystem.

Review by: spoon



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6446 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/server/rpc/impl/SerializabilityUtil.java b/user/src/com/google/gwt/user/server/rpc/impl/SerializabilityUtil.java
index 9b7630f..c1b298a 100644
--- a/user/src/com/google/gwt/user/server/rpc/impl/SerializabilityUtil.java
+++ b/user/src/com/google/gwt/user/server/rpc/impl/SerializabilityUtil.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.user.server.rpc.impl;
 
+import com.google.gwt.user.client.rpc.GwtTransient;
 import com.google.gwt.user.server.rpc.SerializationPolicy;
 
 import java.io.UnsupportedEncodingException;
@@ -220,6 +221,17 @@
     return (result == instanceType) ? null : result;
   }
 
+  static boolean isNotStaticTransientOrFinal(Field field) {
+    /*
+     * Only serialize fields that are not static, transient (including @GwtTransient), or final.
+     */
+    int fieldModifiers = field.getModifiers();
+    return !Modifier.isStatic(fieldModifiers)
+        && !Modifier.isTransient(fieldModifiers)
+        && !field.isAnnotationPresent(GwtTransient.class)
+        && !Modifier.isFinal(fieldModifiers);
+  }
+
   /**
    * This method treats arrays in a special way.
    */
@@ -317,14 +329,4 @@
       return null;
     }
   }
-
-  private static boolean isNotStaticTransientOrFinal(Field field) {
-    /*
-     * Only serialize fields that are not static, transient or final.
-     */
-    int fieldModifiers = field.getModifiers();
-    return !Modifier.isStatic(fieldModifiers)
-        && !Modifier.isTransient(fieldModifiers)
-        && !Modifier.isFinal(fieldModifiers);
-  }
 }
diff --git a/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamReader.java b/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamReader.java
index fe60a77..cb5bf63 100644
--- a/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamReader.java
+++ b/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamReader.java
@@ -790,22 +790,18 @@
         // Iterate over each field and locate a suitable setter method
         Field[] fields = instanceClass.getDeclaredFields();
         for (Field field : fields) {
-          // Consider non-final, non-static, non-transient fields only
-          int mod = field.getModifiers();
-          if (Modifier.isFinal(mod) || Modifier.isStatic(mod)
-              || Modifier.isTransient(mod)) {
-            continue;
-          }
-
-          String fieldName = field.getName();
-          String setterName = "set"
+          // Consider non-final, non-static, non-transient (or @GwtTransient) fields only
+          if (SerializabilityUtil.isNotStaticTransientOrFinal(field)) {
+            String fieldName = field.getName();
+            String setterName = "set"
               + Character.toUpperCase(fieldName.charAt(0))
               + fieldName.substring(1);
-          try {
-            Method setter = instanceClass.getMethod(setterName, field.getType());
-            setters.put(fieldName, setter);
-          } catch (NoSuchMethodException e) {
-            // Just leave this field out of the map
+            try {
+              Method setter = instanceClass.getMethod(setterName, field.getType());
+              setters.put(fieldName, setter);
+            } catch (NoSuchMethodException e) {
+              // Just leave this field out of the map
+            }
           }
         }