Я использую XStream для сериализации некоторых объектов в XML и сталкиваюсь с проблемой с Enums. Исключение, которое я получаю, когда пытаюсь сериализовать объект: "ObjectAccessException: недопустимое конечное поле java.lang.Enum.name".
По-видимому, это проблема с реализацией API отражения в android: он не обрабатывает окончательные поля правильно. Эта проблема действительно существовала в прошлых реализациях официального Sun (Oracle) JDK.
Можете ли вы подтвердить/опровергнуть, что это проблема с Android? Можете ли вы предложить любой другой API сериализации, который можно было бы использовать в этой ситуации?
Единственный способ, которым я мог найти, чтобы обойти это, - создать 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));
Вы можете просто зарегистрировать EnumConverter() из пакета xstream.
xml.registerConverter(new EnumConverter());
Ответ 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.