-1

私は次の問題を抱えています:

ArrayListを.serファイルとして保存しています。ファイルが存在しない場合、例外をスローするのではなく、ロード時に作成されます。

次に、ArrayListに何かを追加して、もう一度保存します。しかし、ArrayListを開くと、空になっています。間違いはどこにありますか?

サーブレット内の巨大なコメントの前にArrayListをスローすると、すべてが正常に機能しているため、空のarraylistを作成し、すべての情報を含むオブジェクトを追加できます。しかし、この更新されたArrayListの保存が問題のようです。

問題がどこにあるのか、なぜそれが起こるのかはわかりません。サーブレットの巨大なコメントの周りだと思います。ここ:

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 />");

理解するための残りのコードは次のとおりです。

サーブレット、最初の文字列は、このサーブレットをロードする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();
            }
        }

}

}

ロードクラス:

パッケージサーブレット;

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;
}
}
4

2 に答える 2

1

Lieferinhalte クラスをシリアライズ可能 (シリアライズ可能を実装) として宣言する必要があります。

于 2012-05-10T21:25:36.397 に答える
1

追加するだけ

implements Serializable

動作するはずです。

于 2012-10-12T21:10:21.037 に答える