Index: xstream/src/java/com/thoughtworks/xstream/converters/javabean/BeanProvider.java =================================================================== --- xstream/src/java/com/thoughtworks/xstream/converters/javabean/BeanProvider.java (revision 1488) +++ xstream/src/java/com/thoughtworks/xstream/converters/javabean/BeanProvider.java (working copy) @@ -72,9 +72,12 @@ PropertyDescriptor property = propertyDescriptors[i]; try { Method readMethod = property.getReadMethod(); - Object value = readMethod.invoke(object, new Object[0]); - visitor.visit(property.getName(), property.getPropertyType(), readMethod - .getDeclaringClass(), value); + + if (visitor.shouldVisit(property.getName(), readMethod.getDeclaringClass())) { + Object value = readMethod.invoke(object, new Object[0]); + visitor.visit(property.getName(), property.getPropertyType(), readMethod.getDeclaringClass(), value); + } + } catch (IllegalArgumentException e) { throw new ObjectAccessException("Could not get property " + object.getClass() @@ -199,5 +202,6 @@ interface Visitor { void visit(String name, Class type, Class definedIn, Object value); + boolean shouldVisit(String name, Class definedIn); } } Index: xstream/src/java/com/thoughtworks/xstream/converters/javabean/JavaBeanConverter.java =================================================================== --- xstream/src/java/com/thoughtworks/xstream/converters/javabean/JavaBeanConverter.java (revision 1488) +++ xstream/src/java/com/thoughtworks/xstream/converters/javabean/JavaBeanConverter.java (working copy) @@ -80,6 +80,10 @@ } } + public boolean shouldVisit(String propertyName, Class definedIn) { + return mapper.shouldSerializeMember(definedIn, propertyName); + } + private void writeField(String propertyName, Class fieldType, Object newObj, Class definedIn) { String serializedMember = mapper.serializedMember(source.getClass(), propertyName); ExtendedHierarchicalStreamWriterHelper.startNode(writer, serializedMember, fieldType); @@ -147,4 +151,4 @@ super(msg); } } -} \ No newline at end of file +} Index: xstream/src/test/com/thoughtworks/xstream/converters/javabean/JavaBeanConverterTest.java =================================================================== --- xstream/src/test/com/thoughtworks/xstream/converters/javabean/JavaBeanConverterTest.java (revision 1488) +++ xstream/src/test/com/thoughtworks/xstream/converters/javabean/JavaBeanConverterTest.java (working copy) @@ -11,10 +11,10 @@ */ package com.thoughtworks.xstream.converters.javabean; +import java.util.Comparator; + import junit.framework.TestCase; -import java.util.Comparator; - import com.thoughtworks.acceptance.objects.StandardObject; import com.thoughtworks.xstream.XStream; @@ -241,6 +241,28 @@ this.trans = trans; } } + + public static class OmittedJavaBeanClass { + + private int id; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getIgnore() { + throw new RuntimeException(); + } + + public void setIgnore(String p) { + + } + + } public void testDoesNotSerializeStaticFields() { TypesOfFields fields = new TypesOfFields(); @@ -326,6 +348,21 @@ TypesOfFields unmarshalledFields = (TypesOfFields)xstream.fromXML(xml); assertEquals(fields, unmarshalledFields); } + + public void testDoesNotSerializeOmittedJavaBeanField() { + OmittedJavaBeanClass c = new OmittedJavaBeanClass(); + XStream xstream = new XStream(); + xstream.registerConverter(new JavaBeanConverter(xstream.getMapper()), XStream.PRIORITY_VERY_LOW); + xstream.alias("omitted", OmittedJavaBeanClass.class); + xstream.omitField(OmittedJavaBeanClass.class, "ignore"); + + String xml = "" + + "\n" + + " 0\n" + + ""; + + assertEquals(xml, xstream.toXML(c)); + } static class Person { private String fName;