Исключение конструктора SimpleXML - невозможно создать внутренний класс

Я только начинаю экспериментировать с Android-разработкой с помощью SimpleXML и думал, что все идет хорошо, пока не столкнулся с проблемой. Приведенный ниже код создает исключение

W/System.err(665): org.simpleframework.xml.core.ConstructorException: невозможно построить внутренний класс

Я просмотрел вопросы о внутренних классах и думаю, что понимаю, почему вы будете их использовать (не то, чтобы мой был обязательно преднамеренным), но, несмотря на перемещение моего кода, чтобы попытаться избежать использования, я все еще немного застрял и был бы признателен за любую помощь .

Исходный код:

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


}

}

С файлом XML, на который ссылаются, структурированным как:

<?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>

Проблема в том, как я аннотировал классы SimpleXML или где я пытаюсь их прочитать? Спасибо!


person Rory    schedule 10.12.2011    source источник


Ответы (2)


Попробуйте удалить @Root из класса allergy.

Кроме того: у вас есть эти два класса, каждый в отдельном файле: аллергия.java и медальертдата.java?

person Peter Knego    schedule 10.12.2011
comment
Спасибо за ваш ответ. Удаление нотации @Root, к сожалению, не дало никакого эффекта. В настоящее время оба класса объявлены в классе Activity после закрытия onCreate() - должны ли они быть в разных файлах? - person Rory; 10.12.2011
comment
Да, все обычные общедоступные классы в Java должны быть объявлены в собственном файле. Другим вариантом было бы сделать их static (не знаю, как с этим справляется SimpleXML). - person Peter Knego; 10.12.2011
comment
Наличие их в одном файле определенно было проблемой =) - person Rory; 11.12.2011
comment
Спасибо! Как предложил Питер, они могут находиться в одном файле, если вы объявите внутренний класс статическим (см. пример здесь: simple.sourceforge.net/download/stream/doc/tutorial/) - person poshaughnessy; 13.12.2012
comment
У меня была аналогичная проблема (невозможно построить внутренний класс), и я решил ее, преобразовав мои внутренние классы (нестатические вложенные классы) во вложенные классы static. Так что @PeterKnego был прав. - person Jonik; 17.04.2013

Я тоже столкнулся с этим, читая некоторые глубоко вложенные данные XML в объекты Java (и желая сохранить простую структуру объекта, определив классы в том же файле).

Решение (которое не предполагает разделения на отдельные файлы) состояло в том, чтобы сделать вложенные классы статическими. (Другими словами, преобразуйте внутренние классы в статические вложенные классы.) Это очевидно в ретроспективе.

Пример;
Вложенная структура:

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

Ява:

@Root
public class ScoreData {

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

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

    // ...
}

Отказ от ответственности: я понимаю, что OP уже решил проблему, но, возможно, это поможет другим, кто сталкивается с org.simpleframework.xml.core.ConstructorException: Can not construct inner class и не хочет определять классы в отдельных файлах как ответ Питера предполагает.

person Jonik    schedule 17.04.2013
comment
Спасибо. Это выглядит намного чище, чем разбивать кучу одноразовых классов на отдельные файлы. - person Christopher Pickslay; 03.10.2014
comment
Это действительно полезный ответ. Спасибо! - person SMBiggs; 30.12.2019