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

Java 将包含对象列表的对象保存到磁盘,java,serialization,arraylist,save,deserialization,Java,Serialization,Arraylist,Save,Deserialization,标题可能有点混乱,甚至有点误导,但我正试图将一个对象保存到磁盘,该对象作为属性包含一个对象列表(ArrayList) 问题是,如果没有列表,这个对象将无法执行任何操作 我尝试了对象和列表的序列化。当我尝试单独序列化对象时,其中没有任何内容,列表是空的。当我尝试序列化列表时,我可以访问列表,更改它,但代价是抛出许多异常 public class AdressBook implements Serializable { /** * */ private sta

标题可能有点混乱,甚至有点误导,但我正试图将一个对象保存到磁盘,该对象作为属性包含一个对象列表(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");

        }
公共类地址簿实现可序列化{
/**
* 
*/
私有静态最终长serialVersionUID=6399534374362987383L;
静态读卡器=新键盘读卡器();
静态ArrayList地址簿=新ArrayList();
公共通讯录(){
}
公共静态void AddContact(){
add(新联系人());
}
公共静态无效EditContact(){
System.out.println(“您希望编辑哪个联系人?”);
Libreta.Display();
System.out.println(“输入联系人的号码”);
int i=(reader.readint()-1);
System.out.println(“选择更改1.姓名2.姓氏3.昵称4.电话号码5.电子邮件”);
int j=reader.readint();
开关(j){
案例1:AddressBook.get(i).setName();
打破
案例2:AddressBook.get(i).setLastName();
打破
案例3:地址簿.get(i).setNick();
打破
案例4:AddressBook.get(i).AddPhoneNumber();
打破
案例5:addressbook.get(i.AddEmail();
打破
默认值:System.out.println(“不是有效选项”);
}

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

您的地址簿变量不应声明为静态变量,因为静态变量没有序列化。将其作为一个实例(非静态)变量,如下所示:

public class AddressBook implements Serializable {
...
  ArrayList<Contact> contacts = new ArrayList<Contact>();
...
}
公共类AddressBook实现可序列化{
...
ArrayList联系人=新建ArrayList();
...
}

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

因此,您应该替换静态字段和静态方法,例如等价的方法


(现在,只需一句注释:您应该尝试使用java命名约定-字段和方法名称使用较低的首字母缩写-java程序员很容易理解您…;-)

静态变量没有序列化。请看