JavaFX中含ObservableList的Seller对象离线存读最简方案
最简单的离线存储Seller对象方案(含ObservableList属性)
嘿,作为Java新手遇到这种带嵌套集合的对象存储问题真的很常见——JDBC处理关联对象确实有点绕,尤其是你还在入门阶段。我给你推荐两个零复杂度、不用折腾数据库的离线存储方案,完全适配你的JavaFX场景:
方案一:Java原生序列化(最省心,不用加依赖)
这个方案直接用Java自带的序列化机制,只要你的Seller和Rating类实现Serializable接口就行,连额外的jar包都不用加。
步骤:
- 让你的实体类实现Serializable:
import java.io.Serializable; import javafx.collections.FXCollections; import javafx.collections.ObservableList; public class Seller implements Serializable { private String name; private String address; // 注意:FXCollections的observableArrayList本身支持序列化,直接用就行 private ObservableList<Rating> ratings = FXCollections.observableArrayList(); // 构造器、getter/setter全写上 public Seller(String name, String address) { this.name = name; this.address = address; } // 省略getter/setter... } public class Rating implements Serializable { private int score; private String comment; public Rating(int score, String comment) { this.score = score; this.comment = comment; } // 省略getter/setter... }
- 写个工具类负责读写文件:
import java.io.*; import java.util.List; public class StorageUtil { // 保存所有Seller到文件 public static void saveSellers(List<Seller> sellers, String filePath) throws IOException { try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) { oos.writeObject(sellers); } } // 从文件加载Seller列表 @SuppressWarnings("unchecked") public static List<Seller> loadSellers(String filePath) throws IOException, ClassNotFoundException { try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { return (List<Seller>) ois.readObject(); } } }
- 在你的JavaFX代码里调用:
// 保存的时候 List<Seller> allSellers = ...; // 你的卖家列表 try { StorageUtil.saveSellers(allSellers, "sellers.dat"); } catch (IOException e) { e.printStackTrace(); } // 加载的时候 try { List<Seller> loadedSellers = StorageUtil.loadSellers("sellers.dat"); // 把加载后的列表放到TableView的数据源里 dealerTable.setItems(FXCollections.observableArrayList(loadedSellers)); } catch (Exception e) { e.printStackTrace(); }
优点:完全原生,代码量极少,不用学新东西;缺点:生成的.dat文件是二进制的,没法直接打开看内容。
方案二:JSON序列化(可读性强,更灵活)
如果想存的内容能直接用记事本打开看,或者以后可能要和其他语言交互,用JSON序列化更合适。这里推荐用Google的Gson库,用法超简单。
步骤:
- 先在你的项目里加Gson依赖(如果是Maven就加下面的依赖,手动的话去官网下个jar包就行):
<!-- Maven依赖 --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency>
- 实体类不用改太多,Gson能自动识别ObservableList(如果识别不了,就先转成普通ArrayList再序列化):
import javafx.collections.FXCollections; import javafx.collections.ObservableList; public class Seller { private String name; private String address; private ObservableList<Rating> ratings = FXCollections.observableArrayList(); // 构造器、getter/setter... } public class Rating { private int score; private String comment; // 构造器、getter/setter... }
- 同样写个工具类:
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.*; import java.util.List; public class JsonStorageUtil { private static final Gson gson = new Gson(); public static void saveSellers(List<Seller> sellers, String filePath) throws IOException { String json = gson.toJson(sellers); try (FileWriter writer = new FileWriter(filePath)) { writer.write(json); } } public static List<Seller> loadSellers(String filePath) throws IOException { try (FileReader reader = new FileReader(filePath)) { // 用TypeToken解决泛型类型擦除的问题 return gson.fromJson(reader, new TypeToken<List<Seller>>() {}.getType()); } } }
- 调用的时候和序列化方案几乎一样:
// 保存 try { JsonStorageUtil.saveSellers(allSellers, "sellers.json"); } catch (IOException e) { e.printStackTrace(); } // 加载 try { List<Seller> loadedSellers = JsonStorageUtil.loadSellers("sellers.json"); // 转成ObservableList给TableView dealerTable.setItems(FXCollections.observableArrayList(loadedSellers)); } catch (IOException e) { e.printStackTrace(); }
优点:JSON文件可读,方便调试;缺点:需要加一个小依赖,但对初学者来说完全没难度。
小提示(针对你的JavaFX场景)
加载完Seller列表后,一定要把普通List转成ObservableList再绑定到TableView上,这样你的选中监听器才能正常触发——因为只有ObservableList才支持JavaFX的属性变更监听,这点你之前的代码应该已经注意到了,这里再提醒一下~
内容的提问来源于stack exchange,提问作者M.Dan
相关产品推荐
相关产品推荐

