Properties serializable machen

Dieses Thema Properties serializable machen im Forum "Allgemeine Java-Themen" wurde erstellt von Kababär, 11. Dez. 2016.

Thema: Properties serializable machen Hi, für meine derzeitige Anwendung würde ich gerne meine Objekte in eine Datei schreiben. Bisher habe ich mir ein...

  1. Hi,

    für meine derzeitige Anwendung würde ich gerne meine Objekte in eine Datei schreiben. Bisher habe ich mir ein eigenes Format ausgedacht (.csv-Format), welches ich aber nicht so prickelnd finde. Es sind zwar nur ein paar Attribute zu speichern, aber dennoch hätte ich gerne ein komfortablere Lösung. Die Objekte sollen dann in einer TableView dargestellt werden, weshalb ich Properties und eine Obversable List verwende.
    Jetzt habe ich das Problem, dass die Properties wohl nicht serializable sind, denn ich bekomme beim Schreiben folgende Fehlermeldung:
    Meine "Model"-Klasse sieht so aus:
    Code (Text):
    public class Module implements Serializable {

        /**
         * Serialize ID
         */
        private static final long serialVersionUID = 1L;

        public StringProperty name;

        public IntegerProperty semester;

        public DoubleProperty grade;

        public StringProperty teacher;

        public IntegerProperty ects;

        public IntegerProperty tries;

        public ObjectProperty<LocalDate> date;

        //weiter getter (für Inhalt und einmal für Property) und settter
     
    Wie würdet ihr das nun lösen? Ich würde nur ungern auf die Properties verzichten wollen ...
    Vielen Dank im voraus.
     
  2. Vielleicht helfen dir diese Java-Grundlagen weiter --> *Klick*
  3. Was spricht denn gegen die schon vorhandene "Properties"-Klasse?
     
  4. Dass die oben genannte Exception fliegt wenn ich die Objekte in eine Datei schreiben will.
    Das hier ist sind die Methoden zum lesen/schreiben der Objekte aus der Datei:
    Code (Text):
    public class FileSerialization {

        /**
         * The standard path for the data file
         */
        private final static String programmPath = "meinPfad";

        /**
         * Writing module object to file.
         *
         * @param module
         */
        public void serializeAddress(Module module) {

            FileOutputStream fout = null;
            ObjectOutputStream oos = null;

            try {

                if (Files.exists(Paths.get(programmPath), LinkOption.NOFOLLOW_LINKS)) {
                    System.out.println("Datei existiert bereits.");
                    Files.delete(Paths.get(programmPath));
                    System.out.println("Datei gelöscht.");
                } else {
                    System.out.println("Datei existiert nicht.");
                    Files.createFile(Paths.get(programmPath));
                    Files.setAttribute(Paths.get(programmPath), "dos:hidden", true);
                }
                fout = new FileOutputStream(programmPath);
                oos = new ObjectOutputStream(fout);
                oos.writeObject(module);

                System.out.println("Done");

            } catch (Exception ex) {

                ex.printStackTrace();

            } finally {

                if (fout != null) {
                    try {
                        fout.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

                if (oos != null) {
                    try {
                        oos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
        }

     
        /**
         * Reading a module from file.
         *
         * @param filename
         * @return
         */
        public Module deserializeAddress() {

            Module module = null;
            String filename = programmPath;
            FileInputStream fin = null;
            ObjectInputStream ois = null;

            try {

                fin = new FileInputStream(filename);
                ois = new ObjectInputStream(fin);
                module = (Module) ois.readObject();

            } catch (Exception ex) {
                ex.printStackTrace();
            } finally {

                if (fin != null) {
                    try {
                        fin.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

                if (ois != null) {
                    try {
                        ois.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }

            return module;

        }
     
     
  5. Hi Kababär,
    Ich hatte auch schon mal ein ähnliches Problem.
    Damit konnte ich es lösen:
    Statt implements Serializable hab ich implements Externalizable genommen, und dann die beiden Methoden: readExternal und writeExternal überschrieben. Damit konnte ich die Serialisierung dann machen.
    Hier ein Beispiel:
    Code (Java):
    import java.io.Externalizable;
    import java.io.IOException;
    import java.io.ObjectInput;
    import java.io.ObjectOutput;
    import javafx.beans.property.SimpleStringProperty;

    public class Packet implements Externalizable {
        private static final long serialVersionUID = -8256294089416034037L;
        private SimpleStringProperty varName = new SimpleStringProperty("");
        private SimpleStringProperty varValue = new SimpleStringProperty("");
     
        public Packet() {
            this("", "");
        }
        public Packet(String varName, String varValue) {
            setVarName(varName);
            setVarValue(varValue);
        }
        public String getVarName() {
            return varName.get();
        }
        public void setVarName(String var) {
            varName.set(var);
        }
       
        public String getVarValue() {
            return varValue.get();
        }
        public void setVarValue(String value) {
            varValue.set(value);
        }
        public SimpleStringProperty getVarNameProperty() {
            return varName;
        }
        public SimpleStringProperty getVarValueProperty() {
            return varValue;
        }
     
        @Override
        public String toString() {
            return getVarName() + ": " + getVarValue();
        }
     
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            setVarName((String) in.readObject());
            setVarValue((String) in.readObject());
        }
     
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            out.writeObject(getVarName());
            out.writeObject(getVarValue());
        }
    }
     
  6. Nimm doch einfach eine H2DB + JPA und gut ists....
     
  7. Ich glaube der Aufwand für eine H2DB + JPA wäre deutlich größer als die Objekte einfach zu de/serialisieren.. wobei beides für mich Neuland ist.

    knilch ich probier das mal aus, danke :)

    Edit: Danke knilch, scheint zu funktionieren :)
     
    Zuletzt bearbeitet: 11. Dez. 2016
  8. Gerne...
     
  9. KOSTENLOSES Java-Grundlagen Training im Wert von 39 € Sichere dir hier den kostenlosen Zugriff auf umfangreiches Java-Know How und starte richtig durch!