gpt4 book ai didi

java - 使用不可序列化的对象序列化 hashmap

转载 作者:行者123 更新时间:2023-11-29 03:25:31 25 4
gpt4 key购买 nike

如何序列化包含不可序列化对象的散列图,在我的例子中是 JavaFX 组件?

final HashMap<String, Button> mapButton = new HashMap<>();
// some for loop adding the components..
try {
FileOutputStream fileOut = new FileOutputStream("Resources/");
ObjectOutputStream objStream = new ObjectOutputStream(fileOut);
objStream.writeObject(mapButton);
objStream.close();
fileOut.close();
System.out.println("Serialized HashMap mapButtons has been stored"
+ " in /tmp/store");
} catch (IOException i) {
i.printStackTrace();
}

抛出:

java.io.NotSerializableException: javafx.scene.control.Button

最佳答案

如果你想序列化对象,那么它们必须是Serializable

由于 javafx.scene.control.Button 不可序列化,您必须找到另一种方法将按钮的状态保存在其他地方。例如。通过引入一个保护状态的纪念类:

public class ButtonMemento implements Serializable {

private static final long serialVersionUID = 1L;

private boolean text;

/*
* Creates a memento that safes the given button's current state.
*/
public ButtonMemento(Button button){
this.text = button.getText();
// extend to record more properties of the button
}

/*
* Used to apply the current mementos state to a button
*/
public void applyState(Button button){
button.setText(text);
// extend to apply more properties to the button
}
}

ButtonMemento 类是一种保护不可序列化对象的状态并在以后恢复它的方法。

final HashMap<String, ButtonMemento> mapButton = new HashMap<>();

for(Button b : buttons){
String mapKey = ...;
mapButton.put(mapKey, new ButtonMemento(b));
}

try {
FileOutputStream fileOut = new FileOutputStream("Resources/");
ObjectOutputStream objStream = new ObjectOutputStream(fileOut);
objStream.writeObject(mapButton);
objStream.close();
fileOut.close();
System.out.println("Serialized HashMap mapButtons has been stored"
+ " in /tmp/store");
} catch (IOException i) {
i.printStackTrace();
}

也许您可以实现类似 BeanMemento 的东西,它可以存储可序列化的 bean 的属性,因此可以与满足 java bean 规范的每个对象一起使用。

关于java - 使用不可序列化的对象序列化 hashmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21255699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com