将包含对象列表的对象保存到磁盘

时间:2014-04-15 20:23:27

标签: java serialization arraylist save deserialization

标题可能有点令人困惑甚至误导,但我试图将一个对象保存到磁盘,该对象作为属性包含对象列表(ArrayList)。

事情就是这个对象在没有列表的情况下无法做任何事情。

我尝试过对象和列表的序列化。当我尝试单独序列化对象时,其中没有任何内容,列表是空的。当我尝试序列化列表时,我可以访问列表,更改它但是以许多抛出异常为代价。

public class AdressBook implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 6399534374362987383L;

    static Reader reader = new KeyboardReader();

    static ArrayList<Contact> AdressBook = new ArrayList<Contact>();

    public AdressBook(){

    }

    public static void AddContact(){
        AdressBook.add(new Contact());
    }

    public static void EditContact(){
        System.out.println("Which contact you desire to edit?");
        Libreta.Display();
        System.out.println("Type in the number of the contact.");
        int i = (reader.readint() - 1);

        System.out.println("Choose the change 1.Name 2.Last Name 3.Nickname 4.Phone number 5.Emails");
        int j = reader.readint();

               switch(j){

        case 1: AdressBook.get(i).setName();
                break;

        case 2: AdressBook.get(i).setLastName();
                break;

        case 3: AdressBook.get(i).setNick();
                break;

        case 4: AdressBook.get(i).AddPhoneNumber();
                break;

        case 5: AdressBook.get(i).AddEmail();
                break;

        default : System.out.println("Not a valid option");

        }

我必须能够编辑对象列表并能够以某种方式再次保存它。我一直在尝试很多方法,但我缺乏知识,或者它对我不起作用。

2 个答案:

答案 0 :(得分:0)

您的地址簿变量不应声明为静态,因为静态变量未序列化。使它成为一个实例(非静态)变量,如下所示:

public class AddressBook implements Serializable {
...
  ArrayList<Contact> contacts = new ArrayList<Contact>();
...
}

答案 1 :(得分:0)

我认为你的问题是你的ArrayList是一个静态字段(有时称为类字段),序列化发生在不在类中的对象实例中。

所以你应该替换你的静态字段和静态方法,例如等价物。

(现在,只是评论:你应该尝试使用java命名约定 - 使用较低的字段和方法名称首字母 - java编码员很容易理解你......; - )