【发布时间】:2017-12-09 10:33:03
【问题描述】:
我在 javafx 文件 IO 上遇到了一些问题。我已经实现了 Serializable 但也有一些错误。感谢您的帮助。
1.Appdata类
package data;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import model.*;
public class AppData implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
public static final ObservableList<Customer> cusInfo = FXCollections.observableArrayList();
static{
Customer Raven = new Customer();
Raven.setName(new SimpleStringProperty("Raven"));
Raven.setPassword("raven09");
Customer Messi = new Customer();
Messi.setName(new SimpleStringProperty("Messi"));
Messi.setPassword("messi10");
Customer Ronaldo = new Customer();
Ronaldo.setName(new SimpleStringProperty("Ronaldo"));
Ronaldo.setPassword("ronaldo07");
Customer Neymar = new Customer();
Neymar.setName(new SimpleStringProperty("Neymar"));
Neymar.setPassword("neymar11");
Account RavenFund = new Account();
RavenFund.setBalance("1000000");
RavenFund.setName(new SimpleStringProperty("RavenFund"));
RavenFund.setLimit("200000");
RavenFund.setType("private");
Account MeRo = new Account();
MeRo.setBalance("200000");
MeRo.setName(new SimpleStringProperty("MeRo"));
MeRo.setLimit("60000");
MeRo.setType("private");
Account Barcelona = new Account();
Barcelona.setBalance("40000");
Barcelona.setName(new SimpleStringProperty("Barcelona"));
Barcelona.setLimit("680000");
Barcelona.setType("business");
Account Madrid = new Account();
Madrid.setBalance("70651");
Madrid.setName(new SimpleStringProperty("Madrid"));
Madrid.setLimit("8000");
Madrid.setType("business");
Raven.add(RavenFund);
Raven.add(Barcelona);
Messi.add(MeRo);
Messi.add(Barcelona);
Ronaldo.add(MeRo);
Ronaldo.add(Madrid);
Neymar.add(Barcelona);
cusInfo.add(Raven);
cusInfo.add(Messi);
cusInfo.add(Ronaldo);
cusInfo.add(Neymar);
}
public static void writeObject() {
try {
FileOutputStream outStream = new FileOutputStream("appdata.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outStream);
objectOutputStream.writeObject(cusInfo);
outStream.close();
System.out.println("successful");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void readObject(){
FileInputStream freader;
try {
freader = new FileInputStream("appdata.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(freader);
ObservableList<Customer> cusINFO =FXCollections.observableArrayList();
cusINFO = (ObservableList<Customer>) objectInputStream.readObject();
//System.out.println("The name is " + cusINFO.get("name"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.账户类
package model;
import java.io.Serializable;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
/**
* @author dell
*
*/
public class Account implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private StringProperty name;
private StringProperty type;
private StringProperty limit;
private StringProperty balance;
public Account(){
name = new SimpleStringProperty();
type = new SimpleStringProperty();
limit= new SimpleStringProperty();
balance= new SimpleStringProperty();
}
public String getType() {
return type.get();
}
public void setType(String type) {
this.type.set(type);
}
public String getLimit() {
return limit.get();
}
public void setLimit(String limit) {
this.limit.set(limit);
}
public String getBalance() {
return balance.get();
}
public void setBalance(String balance) {
this.balance.set(balance);
}
public StringProperty getName() {
return name;
}
public void setName(StringProperty name) {
this.name = name;
}
}
3.客户类
package model;
import java.io.Serializable;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
/**
* @author Raven Xu
* @version 1.2
* @version 1.1
*
*/
public class Customer implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private StringProperty name;
private StringProperty password;
private ObservableList<Account> accounts;
public Customer() {
accounts = FXCollections.observableArrayList();
name = new SimpleStringProperty();
password = new SimpleStringProperty();
}
public StringProperty getName() {
return name;
}
public void setName(StringProperty name) {
this.name = name;
}
public String getPassword() {
return password.get();
}
public void setPassword(String password) {
this.password.set(password);
}
public void add(Account a) {
accounts.add(a);
}
public ObservableList<Account> getAccounts() {
return accounts;
}
}
4.主类
package view;
import data.AppData;
import javafx.application.Application;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import stage.WelcomeStage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
AppData.writeObject();
//AppData.readObject();
primaryStage = WelcomeStage.getStage();
primaryStage.getIcons().add(new Image("file:resources/images/RBClogo.png"));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
5.错误信息
java.io.NotSerializableException: com.sun.javafx.collections.ObservableListWrapper
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at data.AppData.writeObject(AppData.java:74)
at view.Main.start(Main.java:13)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Unknown Source)
我的英语很好。如果您能帮助我,我真的非常感谢您。
【问题讨论】:
-
FXCollections.observableArrayList()的返回值不可序列化! -
我将 observableArraylist 更改为 Hashmap。而且它也不起作用。
标签: java eclipse exception serialization javafx