【问题标题】:Serialization problem with Enums at AndroidAndroid Enums 的序列化问题
【发布时间】:2010-08-20 18:45:53
【问题描述】:

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

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

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

【问题讨论】:

    标签: android enums xstream


    【解决方案1】:

    我能找到解决此问题的唯一方法是为枚举创建一个 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】:

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

      xml.registerConverter(new EnumConverter());
      

      【讨论】:

        【解决方案3】:

        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-08-25
          • 1970-01-01
          • 1970-01-01
          • 2013-03-19
          • 2011-11-23
          • 2012-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多