2010-08-20 3 views
1

J'utilise XStream pour sérialiser certains objets au format XML et je suis confronté à un problème avec Enums. L'exception que je reçois lorsque j'essaie de sérialiser l'objet: "ObjectAccessException: champ final invalide java.lang.Enum.name".Problème de sérialisation avec Enums sur Android

Apparemment, ceci est un problème avec l'implémentation de l'API de réflexion dans Android: Il ne traite pas les champs finaux correctement. Ce problème existait réellement dans les implémentations antérieures du JDK Sun (Oracle) officiel.

Pouvez-vous confirmer/réfuter c'est le problème avec Android? Pouvez-vous suggérer une autre API de sérialisation qui pourrait être utilisée dans cette situation?

Répondre

2

La seule façon que j'ai pu trouver pour contourner cela est de créer un AbstractSingleValueConverter pour enums, puis l'enregistrer avec 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); 
    } 
} 

Utilisez

XStream xml = new XStream(); 
xml.registerConverter(new SingleValueEnumConverter([ENUM].class)); 
2

Vous pouvez simplement vous inscrire EnumConverter() du paquet xstream.

xml.registerConverter(new EnumConverter()); 
0

La réponse de Pintac contient toujours un bogue. Il n'utilise toujours pas la méthode name(), selon les spécifications Java. Après un fil à la liste de diffusion XStream, le bug a été corrigé dans toute version plus grande 1.3.1. S'il vous plaît voir le fil "Enum sur Android" à la liste de diffusion.

La version fixe:

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

Il était le développeur de XStream.