保存更新的ArrayList不起作用

时间:2012-05-10 19:11:44

标签: java serialization servlets save

我遇到了以下问题:

我将ArrayList保存为.ser文件。如果文件不存在,则会在加载时创建,而不是抛出异常。

然后我想在ArrayList中添加一些内容并再次保存。但是当我打开ArrayList时,它是空的。错误在哪里?

当我抛弃ArrayList中的servlet中的巨大注释时,一切正常,因此可以创建一个空的arraylist并添加带有信息的对象。 但是保存这个更新的ArrayList似乎是个问题。

我不知道问题的确切位置或发生的原因。我认为Servlet中存在巨大的评论。这里:

ArrayList<Lieferinhalte> auftraege = new ArrayList();
Lieferinhalte l = new Lieferinhalte();
l.setID(id);
l.setVon(start);
l.setNach(end);
l.setMail(mail);
l.setLink(link);


open o = new open();
auftraege = o.getAuftraege();
auftraege.add(l);

/*-----------> PROBLEM<-------------*/

File file = new File("C:\\Users\\Christoph\\workspace\\ServletTest\\auftraege.ser");

speichern s = new speichern();
s.abspeichern(auftraege);

open o2 = new open();
auftraege = o2.getAuftraege();

out.println(docType + "<HTML>\n"+
        "<HEAD><TITLE>HalloWelt</TITLE></HEAD>\n"+
        "<BODY>" + 
        "Servlet funktioniert! <br /><br />");

以下是用于理解的其余代码:

Servlet,开头的字符串从加载此servlet的jsp文件中获取信息。

package servlet;

import java.io.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



public class LoginCheck extends HttpServlet {
private static final long serialVersionUID = 1L;


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{   
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();

    String id = request.getParameter("ID");
    String start = request.getParameter("Start");
    String end = request.getParameter("End");
    String mail = request.getParameter("Mail");
    String link = request.getParameter("Link"); 
    String docType =
            "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "+
            "Transitional//EN\">\n";

    ArrayList<Lieferinhalte> auftraege = new ArrayList();
    Lieferinhalte l = new Lieferinhalte();
    l.setID(id);
    l.setVon(start);
    l.setNach(end);
    l.setMail(mail);
    l.setLink(link);


    open o = new open();
    auftraege = o.getAuftraege();
    auftraege.add(l);

    /*-----------> PROBLEM<-------------*/

    File file = new File("C:\\Users\\Christoph\\workspace\\ServletTest\\auftraege.ser");

    speichern s = new speichern();
    s.abspeichern(auftraege);

    open o2 = new open();
    auftraege = o2.getAuftraege();

    out.println(docType + "<HTML>\n"+
            "<HEAD><TITLE>HalloWelt</TITLE></HEAD>\n"+
            "<BODY>" + 
            "Servlet funktioniert! <br /><br />");

    for(int i = 0; i < auftraege.size(); i++) {
        String id2 = auftraege.get(i).ID;
        String start2 = auftraege.get(i).von;
        String end2 = auftraege.get(i).nach;
        String mail2 = auftraege.get(i).mail;
        String link2 = auftraege.get(i).link;

         out.println("Die ID war: " + id2 + "<br />" +
                "Der Startpunkt war: " + start2 + "<br />" +
                "Der Endpunkt war: " + end2 + "<br />" + 
                "Die Mail war: " + mail2 + "<br />" + 
                "Der Link war: " + link2 + "<br />");
    }

    out.println("<a href='index.jsp'>Hier</a> geht es zur&uuml;ck zur Eingabemaske!" +
            "</BODY></HTML>");

}
}

储蓄类:

package servlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;

public class speichern {

public void abspeichern(ArrayList<Lieferinhalte> a) {


     OutputStream outputStream = null;
        try
        {
            // Byteorientierten Ausgabekanal Öffnen
            outputStream = new FileOutputStream("auftraege.ser");

            // Objektausgabekanal für Serialisierung Öffnen
            ObjectOutputStream objectOutput = new ObjectOutputStream(outputStream);

            // Objekte serialisiert in Datei ausgeben
            objectOutput.writeObject(a);


            // Ausgabekanal schließen
            objectOutput.close();
        } catch (IOException e)
        {
            e.printStackTrace();
        } finally
        {
            try
            {
                outputStream.close();
            } catch (Exception e)
            {
                e.printStackTrace();
            }
        }

}

}

加载类:

包servlet;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;

public class open {

ArrayList<Lieferinhalte> a;

open() {

    try
    {
        // Serialisiertes Objekt
        FileInputStream inputStream = new FileInputStream("auftraege.ser");
        // Deserialisierung
        ObjectInputStream objectInput = new ObjectInputStream(inputStream);
        // String auslesen
        this.a = (ArrayList<Lieferinhalte>) objectInput.readObject();



    } catch (IOException e)
    {
        speichern s = new speichern();
        ArrayList<Lieferinhalte> auftraege = new ArrayList();
        s.abspeichern(auftraege);

        open o = new open();
        this.a = o.a;


    } catch (ClassNotFoundException e)
    {
       speichern s = new speichern();
       ArrayList<Lieferinhalte> auftraege = new ArrayList();
       s.abspeichern(auftraege);

       open o = new open();
       this.a = o.a;
    }

}

ArrayList<Lieferinhalte> getAuftraege(){
    return a;
}


}

以及应该保存在arraylist中的对象的类:

package servlet;

public class Lieferinhalte {

String link = "";
String ID ="";
String von ="";
String nach ="";
String mail ="";

void setLink(String a) {
    this.link = a;
}

void setID(String a) {
    this.ID= a;
}

void setVon(String a) {
    this.von = a;
}

void setNach(String a) {
    this.nach = a;
}

void setMail(String a) {
    this.mail = a;
}
}

2 个答案:

答案 0 :(得分:1)

你需要将Lieferinhalte类声明为serializable(实现Serializable)!

答案 1 :(得分:1)

只需添加

implements Serializable

比应该工作。