你如何序列化你的枚举?
如果你像这样使用它,它应该可以正常工作,但会返回一些不同的 XML:
例子:
@Root
public class Example
{
@Element
private TestStatus status = TestStatus.AVAILABLE;
// ...
}
测试:
final File f = new File("test.xml");
Serializer ser = new Persister();
ser.write(new Example(), f);
Example m = ser.read(Example.class, f);
XML:
<example>
<status>AVAILABLE</status>
</example>
您可以使用 annotationarguments 重命名 xml-tags,但该值不会更改。
另一个(可能的)解决方案是使用自定义转换器:
枚举的注释:
@Root()
@Convert(TestStatusConverter.class)
public enum TestStatus
{
// ...
}
转换器(示例)
public class TestStatusConverter implements Converter<TestStatus>
{
@Override
public TestStatus read(InputNode node) throws Exception
{
final String value = node.getNext("status").getValue();
// Decide what enum it is by its value
for( TestStatus ts : TestStatus.values() )
{
if( ts.getStatus().equalsIgnoreCase(value) )
return ts;
}
throw new IllegalArgumentException("No enum available for " + value);
}
@Override
public void write(OutputNode node, TestStatus value) throws Exception
{
// You can customize your xml here (example structure like your xml)
OutputNode child = node.getChild("status");
child.setValue(value.getStatus());
}
}
测试(枚举):
final File f = new File("test.xml");
// Note the new Strategy
Serializer ser = new Persister(new AnnotationStrategy());
ser.write(TestStatus.AVAILABLE, f);
TestStatus ts = ser.read(TestStatus.class, f);
System.out.println(ts);
测试(带枚举的类):
如上所述,但有AnnotationStrategy