# Properties serializable machen



## Kababär (11. Dez 2016)

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:


> Caused by: java.io.NotSerializableException: javafx.beans.property.SimpleStringProperty



Meine "Model"-Klasse sieht so aus:

```
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.


----------



## Sogomn (11. Dez 2016)

Was spricht denn gegen die schon vorhandene "Properties"-Klasse?


----------



## Kababär (11. Dez 2016)

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:

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

    }
```


----------



## knilch (11. Dez 2016)

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:

```
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());
    }
}
```


----------



## Tobse (11. Dez 2016)

Nimm doch einfach eine H2DB + JPA und gut ists....


----------



## Kababär (11. Dez 2016)

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


----------



## knilch (11. Dez 2016)

> Edit: Danke knilch, scheint zu funktionieren


Gerne...


----------

