Android上枚举的序列化问题

Android上枚举的序列化问题,android,enums,xstream,Android,Enums,Xstream,我正在使用XStream将一些对象序列化为XML,并且面临枚举问题。尝试序列化对象时遇到的异常:“ObjectAccessException:无效的最终字段java.lang.Enum.name” 显然,这是android中反射API实现的一个问题:它不能正确处理final字段。这个问题实际上存在于官方Sun(Oracle)JDK的过去实现中 你能确认/反驳这是Android的问题吗?您能推荐在这种情况下可以使用的其他序列化API吗 我能找到的唯一解决方法是为枚举创建AbstractSingle

我正在使用XStream将一些对象序列化为XML,并且面临枚举问题。尝试序列化对象时遇到的异常:“ObjectAccessException:无效的最终字段java.lang.Enum.name”

显然,这是android中反射API实现的一个问题:它不能正确处理final字段。这个问题实际上存在于官方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);
    }
}
使用


我能找到的唯一解决方法是为枚举创建一个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包中注册EnumConverter()

xml.registerConverter(new EnumConverter());

您只需从xstream包中注册EnumConverter()

xml.registerConverter(new EnumConverter());

Pintac的答案仍然包含一个bug。根据Java规范,它仍然没有使用name()方法。在XStream邮件列表中出现一个线程之后,该错误在任何更高版本1.3.1中都得到了修复。请查看邮件列表中的“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的开发者

Pintac的答案仍然包含一个bug。根据Java规范,它仍然没有使用name()方法。在XStream邮件列表中出现一个线程之后,该错误在任何更高版本1.3.1中都得到了修复。请查看邮件列表中的“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的开发者