1

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

显然,这是 android 中反射 API 实现的问题:它没有正确处理 final 字段。这个问题实际上存在于官方 Sun (Oracle) JDK 的过去实现中。

您能否确认/反驳这是 Android 的问题?你能建议在这种情况下可以使用的任何其他序列化 API 吗?

4

3 回答 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));
于 2010-09-17T10:27:36.587 回答
2

您可以从 xstream 包中注册 EnumConverter() 。

xml.registerConverter(new EnumConverter());
于 2010-10-25T14:47:20.790 回答
0

Pintac 的答案仍然包含一个错误。根据 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 的开发者。

于 2011-02-10T11:52:40.617 回答