Сохранение / загрузка ObservableList и целого числа в виде XML - PullRequest
0 голосов
/ 25 июня 2018

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

Прежде всего мой ObservableList содержит 6 объектов "Неделя".
Недельный класс:

public class Week {
    double Montag;
    double Dienstag;
    double Mittwoch;
    double Donnerstag;
    double Freitag;
    double Samstag;
    double Sonntag;
    public Week(double montag, double dienstag, double mittwoch, double donnerstag, double freitag, double samstag,
            double sonntag) {
        Montag = montag;
        Dienstag = dienstag;
        Mittwoch = mittwoch;
        Donnerstag = donnerstag;
        Freitag = freitag;
        Samstag = samstag;
        Sonntag = sonntag;
    }
    public double getMontag() {
        return Montag;
    }
    public void setMontag(double montag) {
        Montag = montag;
    }
    public double getDienstag() {
        return Dienstag;
    }
    public void setDienstag(double dienstag) {
        Dienstag = dienstag;
    }
    public double getMittwoch() {
        return Mittwoch;
    }
    public void setMittwoch(double mittwoch) {
        Mittwoch = mittwoch;
    }
    public double getDonnerstag() {
        return Donnerstag;
    }
    public void setDonnerstag(double donnerstag) {
        Donnerstag = donnerstag;
    }
    public double getFreitag() {
        return Freitag;
    }
    public void setFreitag(double freitag) {
        Freitag = freitag;
    }
    public double getSamstag() {
        return Samstag;
    }
    public void setSamstag(double samstag) {
        Samstag = samstag;
    }
    public double getSonntag() {
        return Sonntag;
    }
    public void setSonntag(double sonntag) {
        Sonntag = sonntag;
    }
}

Я создал статический метод, который будет возвращать строку XML.Вызов метода будет выглядеть следующим образом.

String xmlTest = XmlUtils.saveListAsXML(fxTable.getItems(),Double.parseDouble(fxWeek.getText()));

fxTable.getItems () вернет ObservableList с 6 объектами "Week", а другой параметр - просто двойной.
Я думал о создании другого класса«Недели», которые будут содержать двойную переменную и список типа «неделя», а затем просто сериализуют класс Weeks.Как-то это не работает, как я думал?

public static String saveListAsXML(ObservableList<Week> list, double Kalenderwoche) {
    Weeks xmlObj = new Weeks();
    xmlObj.setKalender(Kalenderwoche);
    for (Week w : list) {
        xmlObj.addToList(w);
    }
    StringWriter sw = new StringWriter();
    JAXB.marshal(xmlObj, sw);
    String xmlString = sw.toString();
    return xmlString;
}

Недели Класс:

package Model;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Weeks {
    @XmlElement
    private double Kalenderwoche;
    @XmlElement
    ArrayList<Week> woche= new ArrayList<>();
    public void addToList(Week week) {  
        woche.add(week);
    System.out.println(week.Dienstag);
    }
    public void setKalender(double wert) {
        Kalenderwoche = wert;
    }
}

Результат экспорта выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<weeks>
    <Kalenderwoche>12.0</Kalenderwoche>
    <woche>
        <dienstag>0.0</dienstag>
        <donnerstag>0.0</donnerstag>
        <freitag>0.0</freitag>
        <mittwoch>0.0</mittwoch>
        <montag>50.0</montag>
        <samstag>0.0</samstag>
        <sonntag>0.0</sonntag>
    </woche>
    <woche>
        <dienstag>0.0</dienstag>
        <donnerstag>0.0</donnerstag>
        <freitag>0.0</freitag>
        <mittwoch>0.0</mittwoch>
        <montag>0.0</montag>
        <samstag>0.0</samstag>
        <sonntag>0.0</sonntag>
    </woche>
    <woche>
        <dienstag>0.0</dienstag>
        <donnerstag>0.0</donnerstag>
        <freitag>0.0</freitag>
        <mittwoch>0.0</mittwoch>
        <montag>0.0</montag>
        <samstag>0.0</samstag>
        <sonntag>0.0</sonntag>
    </woche>
    <woche>
        <dienstag>0.0</dienstag>
        <donnerstag>0.0</donnerstag>
        <freitag>0.0</freitag>
        <mittwoch>0.0</mittwoch>
        <montag>0.0</montag>
        <samstag>0.0</samstag>
        <sonntag>0.0</sonntag>
    </woche>
    <woche>
        <dienstag>0.0</dienstag>
        <donnerstag>0.0</donnerstag>
        <freitag>0.0</freitag>
        <mittwoch>0.0</mittwoch>
        <montag>0.0</montag>
        <samstag>0.0</samstag>
        <sonntag>0.0</sonntag>
    </woche>
    <woche>
        <dienstag>0.0</dienstag>
        <donnerstag>0.0</donnerstag>
        <freitag>0.0</freitag>
        <mittwoch>0.0</mittwoch>
        <montag>0.0</montag>
        <samstag>0.0</samstag>
        <sonntag>0.0</sonntag>
    </woche>

(Обратите внимание, что структура на самом деле в порядке, а значения 0,0 правильныев этом случае также хорошо. Единственное, что меня беспокоит, так это то, что раздел "woche" сортируется так: dienstag,donnerstag,freitag,mittwoch,montag,samstag,sonntag, а не сортируется, как в объекте недели montag,dienstag,mittwoch,donnerstag,freitag,samstag,sonntag

Я также создал статический методкоторый должен загрузить XML-файл и создать из него объект Weeks.
Метод выглядит следующим образом:

public static ObservableList<Week> getXmlAsList(File file) {
         try {

                JAXBContext jaxbContext = JAXBContext.newInstance(Weeks.class);

                Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
                Weeks customer = (Weeks) jaxbUnmarshaller.unmarshal(file);

              } catch (JAXBException e) {
                  e.printStackTrace();
              }
        ObservableList<Week> list = FXCollections.observableArrayList();
        return list;
    }

Метод atm просто создает объект Weeks и возвращает пустой список, но создаетОбъект Weeks вообще не работает.

Jun 25, 2018 2:21:39 PM com.sun.xml.internal.bind.v2.ClassFactory create0
INFORMATION: No default constructor found on class Model.Week
java.lang.NoSuchMethodException: Model.Week.<init>()

Я немного озадачен связыванием XML, может кто-нибудь дать мне подсказку или сказать, что я делаю неправильно?
Заранее спасибо.

1 Ответ

0 голосов
/ 25 июня 2018

Jaxb требует, чтобы вы предоставили конструктор, который не принимает параметры.Вам нужно добавить такой конструктор в Week:

public Week() {
    this(0d, 0d, 0d, 0d, 0d, 0d, 0d);
}

Чтобы указать порядок свойств для Week, используя @XmlType.propOrder

@XmlType(propOrder = {"montag", "dienstag", "mittwoch", "donnerstag", "freitag", "samstag", "sonntag"})
public class Week {

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

public static ObservableList<Week> getXmlAsList(File file) {
    try {
        JAXBContext jaxbContext = JAXBContext.newInstance(Weeks.class);

        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        Weeks customer = (Weeks) jaxbUnmarshaller.unmarshal(file);
        return FXCollections.observableArrayList(customer.woche);
    } catch (JAXBException e) {
        throw new RuntimeException(e);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...