Objekt serialisieren/deserialisieren

M

mrnarn

Neues Mitglied
0
Hi,
um wieder den Einstieg in die Android Programmierung zu schaffen, bin ich gerade dabei eine App zu programmieren.
Bei der App muss ich ein Objekt in eine SQLite Datenbank speichern. Im Internet hab ich gelesen, dass dies durch Serialisierung möglich ist. Bei mir funktioniert es jedoch leider noch nicht.

Das Problem tritt in der Methode objektDeserialisieren (Der Aufruf dieser Methode geschieht in "benachrichtigungHinzufuegen") auf. Da läuft irgendetwas schief und es wird der catch-Teil aufgerufen.
Hier mein Code:

Klasse, in der das Objekt serialisiert wird: (Ich hab den Code aus Platzgründen gekürzt)

Code:
public class HinzufuegenActivity extends Activity implements OnClickListener {
 
Dialog d1;
Benachrichtigung b;
Benachrichtigung b2;
//Unwichtiger Code entfernt
 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_hinzufuegen);
 
    //Unwichtiger Code entfernt
 
}
 
 
 
public void benachrichtigungHinzufuegen() {
    if (rbSchnell.isChecked()) {
    b = new Benachrichtigung(this,"schnell",edTitel.getText().toString());
    if(objektDeserialisieren(objektSerialisieren())) {
    b2.setContext(this); 
        b2.showNotification();
    }
// finish();
 
    }
    else {
    b = new             Benachrichtigung(this,"erweitert",edTitel.getText().toString(),edErinnerungstext.getText().toString(),rbDauerhaft.isChecked());
    if(objektDeserialisieren(objektSerialisieren())) {
    b2.setContext(this); 
            b2.showNotification();
    }
// finish(); 
}
 
}
 
 
public String objektSerialisieren() {
     String serializedObject = "";
     try {
         ByteArrayOutputStream bo = new ByteArrayOutputStream();
         ObjectOutputStream so = new ObjectOutputStream(bo);
         so.writeObject(b);
         so.flush();
         serializedObject = bo.toString();
     } catch (Exception e) {
         System.out.println(e);
     }
 
    return serializedObject;
 
}
 
 
public boolean objektDeserialisieren(String serializedObject) {
 
    try {
         byte b[] = serializedObject.getBytes(); 
         ByteArrayInputStream bi = new ByteArrayInputStream(b);
         ObjectInputStream si = new ObjectInputStream(bi);
         b2 = (Benachrichtigung) si.readObject();
         return true;
     } catch (Exception e) {
         d1 = new Dialog(this,e.toString());
         d1.showDialog();
         return false;
     }
 
 
}
}


Hier die Klasse des Objekts, das ich speichern will: (auch gekürzt)

Code:
public class Benachrichtigung implements java.io.Serializable {
 
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
 
    private transient NotificationOpenHandler openHandler;
 
    private transient Context con;
    private String typ;
    private String titel;
    private String text;
    private boolean onGoing;
//  private int id;
 
    public Benachrichtigung(Context pCon, String pTyp, String pTitel, String pText, boolean pOnGoing) {
        con = pCon;
        typ = pTyp;
        titel = pTitel;
        text = pText;
        onGoing = pOnGoing;
    }
 
    public Benachrichtigung(Context pCon, String pTyp, String pTitel) {
        con = pCon;
        typ = pTyp;
        titel = pTitel;
        text ="";
        onGoing = true;
    }
 
    public void setContext (Context pCon) {
        con = pCon;
    }

Wenn ich das Programm so ausführe, wird die Exception "java.io.StreamCorruptedException" agezeigt. Im LogCat steht "01-15 18:13:48.408: W/InputEventReceiver(29935): Attempted to finish an input event but the input event receiver has already been disposed."

Hat jemand eine Idee?

mfg
 
Wenn du Objekte serialisierst, solltest du die Binärdaten nicht in einem String ablegen. Nicht jedes Objekt wird zu einer gültigen UTF8 Sequenz (und du hast mit evtl variierenden Encodings zu kämpfen).

Das ist aber nicht das Problem:

Offenbar speicherst du Sachen wie Context und andere Dinge die einen Spezifischen Livecycle unter Android haben ab und benutzt sie, nachdem sie ungültig geworden sind. Typisch: Context ist nach einer Bilddrehung nicht mehr der alte.

Was es konkret bei dir ist, kann man ohne Stacktrace (mit Hinweis auf die werfende Zeile) und bei Codeausschnitten nicht sagen.
 

Ähnliche Themen

F
Antworten
4
Aufrufe
919
swa00
swa00
P
Antworten
5
Aufrufe
1.401
jogimuc
J
L
  • Litboi
Antworten
3
Aufrufe
915
markus.tullius
markus.tullius
Zurück
Oben Unten