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