Android 中枚举的序列化问题

发布于 2024-09-15 12:02:56 字数 251 浏览 5 评论 0原文

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

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

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

I'm using XStream to serialize some objects to XML, and am facing a problem with Enums. The exception I get when I try to serialize the object: "ObjectAccessException: invalid final field java.lang.Enum.name".

Apparently, this is a problem with the reflection API implementation in android: It doesn't treat final fields correctly. This problem actually existed in past implementations of the official Sun (Oracle) JDK.

Can you confirm/refute this is the problem with Android? Can you suggest any other serialization API that could be used in this situation?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

爱的那么颓废 2024-09-22 12:02:56

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

The only way i could find to get around this is to create a AbstractSingleValueConverter for enums and then register it with 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);
    }
}

Use

XStream xml = new XStream();
xml.registerConverter(new SingleValueEnumConverter([ENUM].class));
嘴硬脾气大 2024-09-22 12:02:56

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

xml.registerConverter(new EnumConverter());

You can just register EnumConverter() from xstream package.

xml.registerConverter(new EnumConverter());
放手` 2024-09-22 12:02:56

Pintac 的答案仍然包含一个错误。根据 Java 规范,它仍然不使用 name() 方法。在 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的开发者。

Pintac's answer still contains a bug. It still does not use the name() method, according to Java spec. After a thread at XStream mailing list, the bug was fixed in any release greater 1.3.1. Please see the thread "Enum on Android" at the mailing list.

The fixed version:

   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));

It was from the developer of XStream.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文