Сериализация Sourceforge SimpleXML Enum - PullRequest
3 голосов
/ 15 февраля 2011

SimpleXML может прекрасно сериализовать Java Enum, но когда дело доходит до десериализации, он возвращает ноль вместо создания Enum из сгенерированного XML.Я что-то делаю неправильно, сериализация Enum вообще не поддерживается?

Сериализация возвращает это:

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

Тест Enum:

   @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;
        }
    }

Ответы [ 2 ]

2 голосов
/ 04 сентября 2012

Как вы сериализуете свой enum?

если вы используете его таким образом, он должен работать без проблем, но вернет какой-то другой 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>

Вы можете переименовать XML-теги с аннотационными аргументами, но значение не может быть изменено.


Другое (возможное) решение - использовать пользовательский конвертер:

Аннотации перечисления:

@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

0 голосов
/ 17 июля 2011

Вам не нужно добавлять аннотации к перечислениям, они сериализуются автоматически.

...