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