Index: E:/data/workspace/xstream/src/java/com/thoughtworks/xstream/converters/reflection/FieldDictionary.java
===================================================================
--- E:/data/workspace/xstream/src/java/com/thoughtworks/xstream/converters/reflection/FieldDictionary.java (revision 880)
+++ E:/data/workspace/xstream/src/java/com/thoughtworks/xstream/converters/reflection/FieldDictionary.java (working copy)
@@ -4,6 +4,7 @@
import com.thoughtworks.xstream.core.util.OrderRetainingMap;
import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
@@ -10,8 +11,14 @@
import java.util.Map;
/**
- * A field dictionary instance caches information about classes fields.
- *
+ *
+ * A field dictionary instance caches information about classes serializable
+ * fields.
+ *
+ *
+ * Serializable fields are non static and non
+ * transient fields.
+ *
*/
public class FieldDictionary {
@@ -66,7 +73,9 @@
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
field.setAccessible(true);
- if (!keyedByFieldName.containsKey(field.getName())) {
+ if (!Modifier.isStatic(field.getModifiers()) &
+ !Modifier.isTransient(field.getModifiers())&
+ !keyedByFieldName.containsKey(field.getName())) {
keyedByFieldName.put(field.getName(), field);
}
keyedByFieldKey.put(new FieldKey(field.getName(), field.getDeclaringClass(), i), field);
Index: E:/data/workspace/xstream/src/test/com/thoughtworks/acceptance/OverwrittenVariableSerializationTest.java
===================================================================
--- E:/data/workspace/xstream/src/test/com/thoughtworks/acceptance/OverwrittenVariableSerializationTest.java (revision 0)
+++ E:/data/workspace/xstream/src/test/com/thoughtworks/acceptance/OverwrittenVariableSerializationTest.java (revision 0)
@@ -0,0 +1,70 @@
+/*
+ * Created on Jun 14, 2006
+ */
+package com.thoughtworks.acceptance;
+
+/**
+ * Ensures that fields can be sub classed by
+ * @author Cyrille Le Clerc
+ */
+public class OverwrittenVariableSerializationTest extends AbstractAcceptanceTest {
+
+ public static class SuperClass {
+
+ protected String variable = "super class value";
+ }
+
+ public static class SimpleSubClass extends SuperClass {
+
+ protected String variable = "simple sub class value";
+
+ }
+
+ public static class OverwritesWithStaticSubClass extends SuperClass {
+
+ static protected String variable = "unexpected static value";
+
+ }
+
+ public static class OverwritesWithTransientSubClass extends SuperClass {
+
+ transient protected String variable = "unexpected transient value";
+
+ }
+
+ public void testSimpleSubClass() {
+ xstream.alias("super-class", SuperClass.class);
+ xstream.alias("sub-class", SimpleSubClass.class);
+
+ String xml = "\n" + " simple sub class value\n"
+ + " super class value\n"
+ + "";
+
+ xstream.fromXML(xml);
+ return;
+
+ //SimpleSubClass object = new SimpleSubClass();
+
+ //assertBothWays(object, xml);
+ }
+
+ public void testOverwritesWithStaticSubClass() {
+ xstream.alias("sub-class", OverwritesWithStaticSubClass.class);
+ String xml = "\n" + " super class value\n"
+ + "";
+
+ OverwritesWithStaticSubClass object = new OverwritesWithStaticSubClass();
+
+ assertBothWays(object, xml);
+ }
+
+ public void testOverwritesWithTransientSubClass() {
+ xstream.alias("sub-class", OverwritesWithTransientSubClass.class);
+ String xml = "\n" + " super class value\n"
+ + "";
+
+ OverwritesWithTransientSubClass object = new OverwritesWithTransientSubClass();
+
+ assertBothWays(object, xml);
+ }
+}