Проблема сериализации с Enums на Android

1

Я использую XStream для сериализации некоторых объектов в XML и сталкиваюсь с проблемой с Enums. Исключение, которое я получаю, когда пытаюсь сериализовать объект: "ObjectAccessException: недопустимое конечное поле java.lang.Enum.name".

По-видимому, это проблема с реализацией API отражения в android: он не обрабатывает окончательные поля правильно. Эта проблема действительно существовала в прошлых реализациях официального Sun (Oracle) JDK.

Можете ли вы подтвердить/опровергнуть, что это проблема с Android? Можете ли вы предложить любой другой API сериализации, который можно было бы использовать в этой ситуации?

Теги:
enums
xstream

3 ответа

2
Лучший ответ

Единственный способ, которым я мог найти, чтобы обойти это, - создать AbstractSingleValueConverter для перечислений, а затем зарегистрировать его с помощью xstream.

public class SingleValueEnumConverter extends AbstractSingleValueConverter
{
    private final Class enumType;

    public SingleValueEnumConverter(Class type)
    {
        this.enumType = type;
    }

    public boolean canConvert(Class c)
    {
        return c.equals(enumType);
    }

    public Object fromString(String value)
    {
        return Enum.valueOf(enumType, value);
    }
}

Использование

XStream xml = new XStream();
xml.registerConverter(new SingleValueEnumConverter([ENUM].class));
2

Вы можете просто зарегистрировать EnumConverter() из пакета xstream.

xml.registerConverter(new EnumConverter());
0

Ответ Pintac по-прежнему содержит ошибку. Он по-прежнему не использует метод name(), согласно спецификации Java. После потока в списке рассылки XStream ошибка была исправлена ​​в любом выпуске 1.3.1. См. Раздел "Enum on Android" в списке рассылки.

Фиксированная версия:

   class FixedEnumSingleValueConverter extends EnumSingleValueConverter {
      FixedEnumSingleValueConverter(Class eType) {
        super(eType);
      }

      public toString(Object obj) {
        return Enum.class.cast(obj).name();
      }
    }

    xstream.registerConverter(new FixedEnumSingleValueConverter(Sample.class));

Это было от разработчика XStream.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню