4

SimpleXML可以很好地序列化 Java Enum,但在反序列化时,它返回 null 而不是从生成的 XML 创建 Enum。根本不支持枚举序列化是我做错了什么吗?

序列化返回:

<TestStatus>
  <status>Functional</status>
</TestStatus>

测试枚举:

   @Root
    public enum TestStatus {

        AVAILABLE("Functional"),
        NOT_AVAILABLE("Dysfunctional");

        @Element
        private String status;

        private Status(String status) {
            this.status = status;
        }

        public String getStatus() {
            return status;
        }
    }
4

2 回答 2

2

你如何序列化你的枚举?

如果你像这样使用它,它应该可以正常工作,但会返回一些不同的 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

于 2012-09-03T22:38:04.217 回答
-2

您不需要向枚举添加注释,它们会自动序列化。

于 2011-07-17T03:12:27.600 回答