Проблема сериализации с Enums на Android - PullRequest
1 голос
/ 20 августа 2010

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

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

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

Ответы [ 3 ]

2 голосов
/ 25 октября 2010

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

xml.registerConverter(new EnumConverter());
2 голосов
/ 17 сентября 2010

Единственный способ найти способ обойти это - создать 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));
0 голосов
/ 10 февраля 2011

Ответ Пинтака по-прежнему содержит ошибку. Он все еще не использует метод 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.

...