Java Serialisierung von JavaFX Properties

S

Sasku

Gast
Hallo zusammen,

ich habe mit JavaFx angefangen und somit auch die Properties .. jetzt versuche ich die mit meinem Programm zu speichern ( serialisieren ).

Code:
package application;
import java.io.Serializable;

import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;

public class Test implements Serializable{

	DoubleProperty doub = new SimpleDoubleProperty();
	
	public double getDoub() {
		return doub.get();
	}
	public void setDoub(Double doub) {
		this.doub.set(doub);
	}
	public DoubleProperty doubleProperty(){
		return doub;
	}

	
}

Das ist die Klasse die Serialisiert werden sollte.


und hier kommt die Main Klasse mit der start Methode

Code:
public class Main extends Application implements Serializable{
	
	FileChooser fch;
	FileOutputStream fs;
	ObjectInputStream ois;
	ObjectOutputStream os;
	Object es ;
	
	File f;
	test eins;
	
	MenuItem open, save;
	Menu dateiMen;
	MenuBar mb;
	@Override
	public void start(Stage stage) {
		try {
			BorderPane root = new BorderPane();
			
			open = new MenuItem("Öffnen");
			save = new MenuItem("Speichern unter...");
			dateiMen = new Menu("Datei");
			mb = new MenuBar();
			dateiMen.getItems().addAll(save, open);
			mb.getMenus().add(dateiMen);
			
						
			
			open.setOnAction(e -> {
				
				fch = new FileChooser();
				f = fch.showOpenDialog(stage);
				
				System.out.println(f.getAbsolutePath());
				
				try {
					FileInputStream fis = new FileInputStream(f.getAbsolutePath());
					ois = new ObjectInputStream(fis);
					es = ois.readObject();
					eins =  (test) es;
					ois.close();
				} catch (Exception e1) {
					e1.printStackTrace();
				}
				
				System.out.println(eins.getDoub());
			});
			
			save.setOnAction(new EventHandler<ActionEvent>() {
				
				@Override
				public void handle(ActionEvent event) {
					eins = new test();
					fch = new FileChooser();
					
					eins.setDoub(32.0);
					f = fch.showSaveDialog(stage);
					
					if ( f != null)
					try {
						fs = new FileOutputStream(f.getAbsolutePath());
						os = new ObjectOutputStream(fs);
						os.writeObject(eins);
						os.close();
					} catch (IOException e) {	
						e.printStackTrace();
					}
				}
			});
			
			
			root.setTop(mb);
			Scene scene = new Scene(root,400,400);
			stage.setScene(scene);
			stage.show();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		launch(args);
	}
}



So wenn ich das jetzt ausführe kommt das als Exception:

"java.io.NotSerializableException: javafx.beans.property.SimpleDoubleProperty"


Weis jemand wie ich das machen kann?
 
Dann wird SimpleDoubleProperty wohl nicht Serializable sein ;) Könntest versuchen die klasse zu extenden und Serializable implmentieren.

Wobei ich mich echt frage, wann ich das letzte mal Serializable gesehen habe. Wer benutzt sowas denn noch?

Alternativ kannst du auch Jaxb oder Jackson nehmen und deine Klassen nach XML, JSON oder sonstwas serialisieren.
 
Habe ich schon versucht, hat nicht geklappt .. wird wohl nicht funktionieren .. :/

Jaxk, Jackson? noch nie gehört, werd mich mal umschauen, danke!
 
benneque schrieb:
Wobei ich mich echt frage, wann ich das letzte mal Serializable gesehen habe. Wer benutzt sowas denn noch?

Bei großen, clusterfähigen Frameworks im EE-Bereich sieht man sowas eigentlich noch recht häufig, würde ich meinen. Wer seinen eigenen Kram nicht serialisierbar hält, kriegt dann vom Kunden Logs, die mit NotSerializableExceptions zugeballert sind. So zumindest meine Erfahrung.
 
Aber das kommt doch immer auf die Technologie an mit der man die Daten überträgt. Im Java Umfeld gibts mindestens 20 Technologien um Klassen zu serialisieren, die meisten davon nicht Java spezifisch: Kryo, FST, Protobuf, Avro, Thrift, XML, JSON, etc. pp.

Mir ist evtl. noch ein Weg eingefallen gegen die Exception, keine Ahnung ob's funktioniert:
Man baut sich eine "TestBase implements Serializable" Klasse, die als Feld ein "Double doub" enthält und lässt dann "Test" davon erben. Dann sollte "TestBase" auf jeden Fall serialisierbar sein. Jetzt stellt sich nur noch die Frage, wie man die Daten zwischen dem "Double doub" und dem "DoubleProperty doub" synchron hält...

Sonst bleibt natürlich immer noch der gute alte Weg über 2 Klassen: "TestToSerializableConverter" und "SerializableToTestConverter". Wobei das am Ende natürlich dann den größten Schreibaufwand mit sich bringt, dafür ist man am flexibelsten und kann die Interna der Test Klasse austauschen, etc.
 
Zuletzt bearbeitet:
@mental.dIseASe: bei uns in der Firma wird Serializable auch noch verwendet, allerdings nutzen wir (noch) kein Java 8 und damit JavaFx.

@benneque: Danke dir für die hilfen... hat allerdings nicht geklappt, muss jetzt wohl ne anderes Serialisierungsmethode finden. ^^
 
Naja, von Hand kannste immer Serialisieren ;) Mit Jaxb oder Jackson ist extrem trivial (eigene Erfahrung), wenn das Datenmodell es mitmacht. Sonst kannst du natürlich auch eine zweite Klasse erstellen, die quasi identisch ist, nur statt DoubleProperty einfache Doubles benutzt. Und dann halt von Hand die Daten konvertieren. Das konvertieren lässt sich natürlich auch automatisieren mit Dozer oder Geda oder ähnlichem, die matchen dann einfach die Propertynamen und kopieren die Daten.
Oder du lässt das Ganze automatisieren und generierst die nötigen Klassen beim Hochfahren via Reflection ;)
 
Zurück
Oben