Сериализация Sourceforge SimpleXML Enum

SimpleXML может прекрасно сериализовать Java Enum, но когда дело доходит до десериализации, он возвращает null вместо создание Enum из сгенерированного 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;
        }
    }

person Abidi    schedule 15.02.2011    source источник
comment
вы можете цитировать XML как код - вам не нужно добавлять символы амперсанда   -  person peter.murray.rust    schedule 15.02.2011
comment
@ Питер, обязательно сделаю это, Та.   -  person Abidi    schedule 15.02.2011
comment
@Afridi Я имел в виду, что отредактировал твой текст, чтобы показать XML...   -  person peter.murray.rust    schedule 15.02.2011
comment
возможный дубликат SimpleXML enum enum-sensitivity   -  person Vladimir Ivanov    schedule 28.01.2015
comment
на самом деле ответ здесь, голосование за закрытие как дубликат /10069903/   -  person Vladimir Ivanov    schedule 28.01.2015


Ответы (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>

Вы можете переименовать 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

person ollo    schedule 03.09.2012

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

person ng.    schedule 17.07.2011
comment
Ну, в вопросе упоминается, что проблема связана с десериализацией - person Vladimir Ivanov; 28.01.2015