1

XStream を使用して一部のオブジェクトを XML にシリアライズしていますが、列挙型の問題に直面しています。オブジェクトをシリアル化しようとすると、「ObjectAccessException: 無効な最終フィールド java.lang.Enum.name」という例外が発生します。

どうやら、これは Android でのリフレクション API の実装に問題があるようです。最終フィールドが正しく処理されません。この問題は、公式の Sun (Oracle) JDK の過去の実装に実際に存在していました。

これが Android の問題であることを確認/反論できますか? この状況で使用できる他のシリアル化 API を提案できますか?

4

3 に答える 3

2

xstream パッケージから EnumConverter() を登録するだけです。

xml.registerConverter(new EnumConverter());
于 2010-10-25T14:47:20.790 に答える
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 に答える
0

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の開発者からのものでした。

于 2011-02-10T11:52:40.617 に答える