2011-12-10 11 views
7

Sto solo iniziando a sperimentare con Android Development con SimpleXML e ho pensato che stesse andando abbastanza bene fino a quando non ho avuto un problema. Il seguente codice produce un'eccezione diEccezione Costruttore SimpleXML - Impossibile creare Inner Class

W/System.err (665): org.simpleframework.xml.core.ConstructorException: Impossibile costruire classe interna

Ho guardato attraverso le domande sulle classi interne e penso di capire perché li useresti (non che il mio fosse necessariamente intenzionale) ma nonostante avessi spostato il mio codice per cercare di evitare l'utilizzo, sono ancora un po 'bloccato e apprezzerei qualsiasi aiuto.

Source Code:

public class InCaseOfEmergencyMedAlertAllergiesActivity extends Activity { 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 


    Serializer serializer = new Persister(); 
    InputStream xmlstream = this.getResources().openRawResource(R.raw.sample_data_allergies); 
    try { 
     medalertdata allergyObject = serializer.read(medalertdata.class, xmlstream); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    setContentView(R.layout.allergies); 
} 

@Root 
public class medalertdata { 
    @ElementList 
    private List<allergy> allergyList; 

    public List getAllergies() { 
     return allergyList; 
    } 
} 

@Root 
public class allergy{ 

    @Element 
    private String to; 

    @Element 
    private Boolean medical; 

    @Element 
    private String notes; 

    public allergy(String to, Boolean medical, String notes){ 
     this.to = to; 
     this.medical = medical; 
     this.notes = notes; 
    } 

    public String getTo() { 
     return to; 
    } 

    public Boolean getMedical() { 
     return medical; 
    } 

    public String getNotes() { 
     return notes; 
    } 


} 

}

Con il file XML referenziata così strutturato:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<medalertdata> 
<allergy> 
    <to>Penicillin</to> 
    <medical>true</medical> 
    <notes></notes> 
</allergy> 
<allergy> 
    <to>Bee Stings</to> 
    <medical>false</medical> 
    <notes>Sample</notes> 
</allergy> 
</medalertdata> 

è il problema di come ho annotato le classi SimpleXML o dove sto cercando leggerli? Grazie!

risposta

5

Provare a rimuovere @Root dalla classe allergy.

Inoltre: avete queste due classi ciascuna nel suo file separato: allergy.java e medalertdata.java?

+0

Grazie per la risposta. La rimozione della notazione di @Root purtroppo non ha avuto alcun effetto. Attualmente entrambe le classi sono dichiarate all'interno della classe Activity dopo che onCreate() è stato chiuso - dovrebbero trovarsi in file diversi? – Rory

+4

Sì, tutte le normali classi pubbliche in Java devono essere dichiarate nel proprio file. Un'altra opzione sarebbe quella di renderli 'static' (non so come SimpleXML gestisca questo). –

+2

Averli nello stesso file era sicuramente il problema =) – Rory

12

Mi sono imbattuto anche in questo mentre leggevo alcuni dati XML profondamente nidificati in oggetti Java (e volevo mantenere la struttura dell'oggetto semplice definendo le classi nello stesso file).

La soluzione (che non prevede la suddivisione in file separati) consisteva nel rendere le classi nidificate statiche. (In altre parole, convertire inner classes into static nested classes.) È ovvio in retrospettiva.

Esempio;
struttura annidata:

// ScoreData 
// Sport 
//  Category 
//  Tournament 

Java:

@Root 
public class ScoreData { 

    @ElementList(entry = "Sport", inline = true) 
    List<Sport> sport; 

    static class Sport { 
     @ElementList(entry = "Category", inline = true) 
     List<Category> category; 
    } 

    // ... 
} 

di responsabilità: mi rendo conto OP ottenuto il problema risolto già, ma forse questo aiuta gli altri che corrono in org.simpleframework.xml.core.ConstructorException: Can not construct inner class e non vogliono definire la classi in file separati come suggerisce Peter's answer.

+3

Grazie.Ciò sembra molto più pulito rispetto alla suddivisione di un gruppo di classi monouso in file separati. –

Problemi correlati