|
Here is a version with support for enums with methods.
public class EnumConverter extends Converter { public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { writer.setValue(((Enum)source).name()); } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
return Enum.valueOf(context.getRequiredType().getSuperclass(), reader.getValue());
} Yet another fix:
public class EnumConverter extends Converter { public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { writer.setValue(((Enum)source).name()); } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
Class c = context.getRequiredType().getSuperclass() == Enum.class ? context.getRequiredType() : context.getRequiredType().getSuperclass();
return Enum.valueOf(c, reader.getValue());
} I am using version 1.1.1 with xpp3_min-1.1.3.4.I.jar
Here is a UnitTest:
public class XStreamTest extends TestCase { protected void setUp() throws Exception { super.setUp(); xStream = new XStream(); xStream.registerConverter(new EnumConverter()); } public void test() throws Exception { User user = PicapsResourceFactory.getInstance().getUserRegistry().getUser("plantfloor"); assertEquals(user, xStream.fromXML(xStream.toXML(user))); } public void testEnum() throws Exception { assertEquals(SimpleEnum.Test1, xStream.fromXML(xStream.toXML(SimpleEnum.Test1))); assertSame(SimpleEnum.Test1, xStream.fromXML(xStream.toXML(SimpleEnum.Test1))); assertEquals(AnotherEnum.Test1, xStream.fromXML(xStream.toXML(AnotherEnum.Test1))); assertSame(AnotherEnum.Test1, xStream.fromXML(xStream.toXML(AnotherEnum.Test1))); } private enum SimpleEnum { Test1, Test2; } private enum AnotherEnum { abstract Object getObj(); Thanks Bryan. Enum support had already been added for
I have also added EnumMapper that ensures that the polymorphic enums don't get converted into the $1 classes, meaning the XML is cleaner and aliases can be used for enums. I've credited your work in the code and added you to the contributors page. No further comment from reporter
|
|||||||||||||||||||||||||||||||||||||||||
You could add an EnumConverter.
public class EnumConverter extends Converter {
public boolean canConvert(Class type) { return type.isEnum(); }
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { writer.setValue(((Enum)source).name()); }
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { return Enum.valueOf(context.getRequiredType(), reader.getValue()); }
}