在java中序列化数组列表

时间:2014-01-23 14:04:06

标签: java serialization arraylist save loading

我正在用java创建一个酒店预订系统,我在保存和加载信息方面遇到了问题。我有一个名为Global的类,它存储所有数组:

import java.io.*;
import java.util.*;

public class Global implements Serializable {
    public static ArrayList<Guests> guests = new ArrayList<Guests>();
    public static ArrayList<Reservations> reservations = new ArrayList<Reservations>();
    public static ArrayList<Rooms> rooms = new ArrayList<Rooms>();
}   

我还有一个名为ToSave的课程:

import java.io.*;
import java.util.*;

public class ToSave implements Serializable {
    public ArrayList<Guests> getGuests() {
        return Global.guests;
    }

    public void setGuests(ArrayList<Guests> guests) {
        Global.guests = guests;
    }

    public ArrayList<Reservations> getReservations() {
        return Global.reservations;
    }

    public void setReservations(ArrayList<Reservations> reservations) {
        Global.reservations = reservations;
    }

    public ArrayList<Rooms> getRooms() {
        return Global.rooms;
    }

    public void setRooms(ArrayList<Rooms> rooms) {
        Global.rooms = rooms;
    }

    public void save(String filename) {
        try {
            FileOutputStream fileOut = new FileOutputStream(filename);
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(this);
            out.close();
            fileOut.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void load(String filename) {
        try {
            FileInputStream fileIn = new FileInputStream(filename);
            ObjectInputStream in = new ObjectInputStream(fileIn);
            ToSave save = (ToSave)in.readObject();
            this.setGuests(save.getGuests());
            this.setReservations(save.getReservations());
            this.setRooms(save.getRooms());
            in.close();
            fileIn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }      
} 

然后最后我有一个名为uiMethods的类,它存储了保存和加载按钮:

if(clicker == save) {
    ToSave save = new ToSave();
    save.setGuests(Global.guests);
    save.setReservations(Global.reservations);
    save.setRooms(Global.rooms);
    save.save(filename);
}

if(clicker == load) {
   ToSave save = new ToSave();
   save.load(filename);
   Global.guests = save.getGuests();
   Global.reservations = save.getReservations();
   Global.rooms = save.getRooms();
}  

FYI这是Guests类包含的内容:

public class Guests implements Serializable {
    Integer id;
    String name, surname, email, mobile, passport;

    public Guests() {
    }

    public Guests(int id, String name, String surname, String mobile, String email, String passport) {
        this.id = id;
        this.name = name;
        this.surname = surname;
        this.mobile = mobile;
        this.email = email;
        this.passport = passport;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public String getMobileNo() {
        return mobile;
    }

    public void setMobileNo(String mobile) {
        this.mobile = mobile;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassportNo() {
        return passport;
    }

    public void setPassportNo(String passport) {
        this.passport = passport;
    }

    public boolean equals(int guestId) {
        if (id == guestId) {
            return true;
        } else {
            return false;
        }        
    } 

    public Guests searchGuestById(int searchId) {
        for (int i = 0; i < Global.guests.size(); i++) {
            if (Global.guests.get(i).id == searchId) {
                return Global.guests.get(i);
            }
        }

        return null;
    }

    public void editGuest(Guests guestFound, uiMethods ui) {
        ui.guestId.setText(Integer.toString(Global.guests.indexOf(guestFound))); 
        ui.name.setText(guestFound.name);
        ui.surname.setText(guestFound.surname);
        ui.mobileNo.setText(guestFound.mobile);
        ui.email.setText(guestFound.email);
        ui.passportNo.setText(guestFound.passport);
    }

    public void deleteGuest(Guests guestFound) {
        Global.guests.remove(Global.guests.indexOf(guestFound));        
    }

    private boolean validation(uiMethods ui) {
        if (ui.name.getText().trim().length() == 0) {
            JOptionPane.showMessageDialog(ui, "Name cannot be empty", "Error", JOptionPane.ERROR_MESSAGE);
            return false;
        }

        if (ui.surname.getText().trim().length() == 0) {
            JOptionPane.showMessageDialog(ui, "Surname cannot be empty", "Error", JOptionPane.ERROR_MESSAGE);
            return false;
        }

        if (ui.mobileNo.getText().trim().length() == 0) {
            JOptionPane.showMessageDialog(ui, "Mobile number cannot be empty", "Error", JOptionPane.ERROR_MESSAGE);
            return false;
        }

        if (ui.email.getText().trim().length() == 0) {
            JOptionPane.showMessageDialog(ui, "Email cannot be empty", "Error", JOptionPane.ERROR_MESSAGE);
            return false;
        }

        if (ui.passportNo.getText().trim().length() == 0) {
            JOptionPane.showMessageDialog(ui, "Passport number cannot be empty", "Error", JOptionPane.ERROR_MESSAGE);
            return false;
        }

        return true;
    }

    public boolean detailsForm(uiMethods ui) {      
        if(this.validation(ui)) {
            Guests guest = new Guests();

            guest.id = Integer.parseInt(ui.guestId.getText());
            guest.name = ui.name.getText();
            guest.surname = ui.surname.getText();
            guest.mobile = ui.mobileNo.getText();
            guest.email = ui.email.getText();
            guest.passport = ui.passportNo.getText();

            Global.guests.add(guest.id, guest);

            return true;
        }

        return false;
    }
}

当我加载程序时,它给出了以下错误:java.io.notserializableexception

任何想法如何解决这个问题?非常感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

某些课程GuestsRoomsReservations不是Serializable。 或者它包含对不是Serializable的对象的引用。 你需要修复它,错误就会消失。

http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

答案 1 :(得分:0)

NotSerializableException表示系统无法序列化特定的对象状态。

  1. 确保完整序列化过程中的所有AGGREGATED对象都是Serializable。
  2. 阅读完整的日志并跟踪对象的名称。

答案 2 :(得分:0)

java.io.notserializableexception表示您要保存的对象不是可序列化的。

您想要保存对象的ArrayList,因此其中一些对象不可序列化

您应该检查:RoomsReservationsGuestsSerializable 如果没有,他们必须实现Serializable接口。