我遇到了以下问题:
我将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ü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;
}
}
答案 0 :(得分:1)
你需要将Lieferinhalte类声明为serializable(实现Serializable)!
答案 1 :(得分:1)
只需添加
implements Serializable
比应该工作。