Поскольку вы утверждаете, что ваш код работает, я просто скопировал его и вставил из исходного вопроса.
Вы были на правильном пути, вы просто:
- Нужнометод, который при вызове из вашего основного файла будет принимать BuildingGUI в качестве аргумента и сериализовать его для хранения на диске.
- Нужен метод, который при вызове будет принимать имя файла в качестве аргумента, de-сериализуйте файл и верните вам BuildingGUI.
Вы можете сделать то же самое, но для объектов типа Building
.Просто измените параметры метода, чтобы он принимал Building
вместо BuildingGUI
.
//Method to serialize and store specific BuildingGUI
public void buildingSaver(BuildingGUI building) throws IOException {
//Create file output stream
FileOutputStream fileOutStr = new FileOutputStream("theBuilding.ser");
//Create object output stream and write object
ObjectOutputStream objOutStr = new ObjectOutputStream(fileOutStr);
objOutStr.writeObject(Building2);
//Close all streams
objOutStr.close();
fileOutStr.close();
System.out.printf("Serialized data is saved in a file - theBuilding.ser");
}
//Method to deserialize BuildingGUI from file
public BuildingGUI buildingLoader(String filename) throws IOException,
ClassNotFoundException{
FileInputStream fileInStr = new FileInputStream(filename);
ObjectInputStream objInStr = new ObjectInputStream(fileInStr);
BuildingGUI building = (BuildingGUI) objInStr.readObject();
objInStr.close();
fileInStr.close();
return building;
}
Что происходит, если у вас много типовобъекта, который вам нужно сохранить?
Вам нужно написать отдельный метод для всех них?
Ответ: нет .
Вы можете использовать более общий (а также static
) метод, который принимает объект в качестве параметра, например:
//parameter is Object, instead of Building
public static void writeObjectToDisk(Object obj, String name) throws IOException {
//Create file output stream
FileOutputStream fileOutStr = new FileOutputStream(name);
//Create object output stream and write object
ObjectOutputStream objOutStr = new ObjectOutputStream(fileOutStr);
objOutStr.writeObject(obj);
//Close all streams
objOutStr.close();
fileOutStr.close();
System.out.printf("Serialized data is saved in a file - "+name);
}
public static Object objectLoader(String filename) throws IOException,
ClassNotFoundException{
FileInputStream fileInStr = new FileInputStream(filename);
ObjectInputStream objInStr = new ObjectInputStream(fileInStr);
Object obj = (Object) objInStr.readObject();
objInStr.close();
fileInStr.close();
return obj;
}
Чтобы получить Building
изнутри BuildingGUI
, вам понадобится метод доступа:
public class BuildingGUI extends Application implements Serializable{
private Building theBuilding;
public Building getBuilding(){
return this.theBuilding;
}
/*other code..*/
}
Наконец, внутри вашего main
метода:
public static void main(String[] args) {
//initialize BuildingGUI object and get the Building object
BuildingGUI building2 = new BuildingGUI();
Building myBuilding = building2.getBuilding();
//we serialize the Building, by casting it to (Object) and feeding it to the method
try{
someClass.writeObjectToDisk((Object)myBuilding);
}
catch(IOException ioe){
ioe.printStackTrace();
}
Building myBuilding2 = null;
BuildingGUI buildingGUI = null;
//now for deserializing
try{
//We cast to appropriate type, because method returns 'Object'
myBuilding2 = (Building)objectLoader("building.ser");
buildingGUI = (BuildingGUI)objectLoader("buildingGUI.ser");
}
catch(IOException ioe){
ioe.printStackTrace();
}
catch(ClassNotFoundException cnfe){
cnfe.printStackTrace();
}
}
Заключительное примечание : Если вы инициализируете ссылку на объект Building
внутри вашего BuildingGUI
класса.Затем, когда вы сериализуете BuildingGUI
, вы также неявно сериализуете ссылку на объект Building
.Таким образом, когда вы десериализуете BuildingGUI
, вы также сможете получить доступ к Building
.Я добавлю одну последнюю парадигму.
public class BuildingGUI extends Application implements Serializable{
private Building theBuilding = new Building(); <-- we initialize it
public Building getBuilding(){
return this.theBuilding;
}
}
public static void main(String[] args) {
//initialize BuildingGUI object and get the Building object
BuildingGUI building2 = new BuildingGUI();
//we serialize the Building, by casting it to (Object) and feeding it to the method
try{
someClass.writeObjectToDisk((Object)building2);
}
catch(IOException ioe){
ioe.printStackTrace();
}
BuildingGUI buildingGUI = null;
//now for deserializing JUST THE BUILDINGGUI
try{
//We cast to appropriate type, because method returns 'Object'
buildingGUI = (BuildingGUI)ObjectLoader("buildingGUI.ser");
}
catch(IOException ioe){
ioe.printStackTrace();
}
catch(ClassNotFoundException cnfe){
cnfe.printStackTrace();
}
//You can get the building this way
Building myBuilding = buildingGUI.getBuilding();
}