Android ClassNotFoundException bei Deserialisierung

Tort-E

Mitglied
Guten Morgen zusammen,

ich bin am verzweifeln ....

Ich habe eine kleine App, die aus einer Email ein serisalisiertes einliest bzw. einlesen soll und die darin gespeicherten Daten zur Anzeige bringen soll.

In Android Studio habe ich im gleichem Paket wie die MainActivity.java meine Klasse "Objekt" erstellt. Diese Klasse hat die gleiche Signatur und die gleiche ID wie die Klasse, die das sterilisierte Objekt erstellt.
Alles lässt sich super kompilieren und die App auch starten. Bis jetzt noch ohne Fehler. Sobald ich die Datei einlese, wird mir eine ClassNotFoundException:Objekt geworfen.

Hier mal der Code:
Das Objekt o wird bereits als Instanzvariable deklariert (o=null)
Java:
private void importData(Uri data) {
        final String scheme = data.getScheme();

        if (ContentResolver.SCHEME_CONTENT.equals(scheme)) try {

            ContentResolver cr = getContentResolver();
            InputStream is = cr.openInputStream(data);
            ObjectInputStream objectInput = new ObjectInputStream(is);
            o = (Objekt) objectInput.readObject();
            txtHello.setText(o.getEigenschaft());


       /* } catch (ClassNotFoundException exception) {
            System.err.println("Fehler: " + exception.toString());*/
        } catch (Exception e){
            e.printStackTrace();
        }
    }

Könnt Ihr mir helfen?
Die Deserialisierung funktioniert, sobald ich in Eclipse etc eine Testklasse schreibe, die genauso aussieht (nur halt nicht unter Android).:rtfm:
 

dzim

Top Contributor
Also wo genau kracht es? In der Zeile 10?

Also laut dem Beispiel hier, sehe ich an deinem Code keinen Grund, ausser dass du den Content Resolver verwendest. Bist du sicher, dass der InputStream in Zeile 8 richtig geladen werden konnte? Ich vermute, dass hier das Problem liegt.
 

Tort-E

Mitglied
Erstmal danke für die Hilfe :) Habe mir aus deinem Link ein paar nützliche Anregungen ziehen können.

Ich habe jetzt die Datei im Download Ordner gespeichert und versuche die Datei nun zu laden... aber vergebens. Immer eine ClassNotFoundException, obwohl die Klasse im gleichem Package liegt.

Der Dateipfad wird ebenfalls richtig ermittelt ... im Android Manifest sind die permissions EXTERNAL_STORAGE (Read und Write) hinterlegt.

Die Dateipfade hier f werden korrekt ausgelesen: /mnt/sdcard/Download/datenNotes.ser

Hier ist der modifizierte Code
Java:
private void importData(Uri data) {
            try {
                ContentResolver cr = getContentResolver();
                InputStream is = cr.openInputStream(data);
                File f = new File(data.getEncodedPath()); // /mnt/sdcard/Download/datenNotes.ser
                NotesObjekt obj = (NotesObjekt)loadSerializedObject(f);
                System.out.println("Datenpfad: " + data.getEncodedPath());
                System.out.println("f: " + f.getAbsolutePath());
                //txtHello.setText(obj.getEigenschaft());

            } catch (Exception e) {
                System.out.println("Fehler " + e.toString());
                e.printStackTrace();
            }
    }

    public Object loadSerializedObject(File f)
    {
        try
        {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f.getAbsolutePath()));
            Object o = ois.readObject();
            return o;
        }
        catch(Exception ex)
        {
           // System.out.println("Serialization Read Error : ", ex.getMessage());
            ex.printStackTrace();
        }
        return null;
    }

Es kracht in Zeile 7 ---- :bahnhof: :(
 

dzim

Top Contributor
Hm. Zum einen habe ich noch nie Java-Serialisierung nutzen müssen (hab auch mal gehört, dass soll irgendwann von Google in Android stark eingeschränkt worden sein, hab dafür aber keinen Beleg gefunden). Ich habe wenn dann immer von/nach XML (z.B. SimpleXML) oder JSON (der integrierte Parser, oder Jackson) de-/serialisiert.

Serializable | Android Developers (Android empfiehlt das wohl auch)
Interessant ist vielleicht auch Parcelable vs Serializable (wenn es um Performance geht)

Ich finde deinen Prozess, wie du ein File öffnest, etwas schief, aber ich glaube nicht, dass er hier der Grund ist, allerdings ohne zu wissen, was deine Eingabe (die URI) ist und ob #importData eine exception geworfen wird - und wenn ja, was drin steht - kann ich dir im Moment nicht wirklich weiterhelfen. Der Code sieht soweit korrekt aus, auch wenn ich dein Konstrukt um das File herum nicht verstehe.

Ach so: Vielleicht noch eine Frage... Woher kommt die serialisierte Klasse? Hast du sie zuvor auch mit Android serialisiert?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Android Deserialisierung HashMap Android & Cross-Platform Mobile Apps 14

Ähnliche Java Themen

Neue Themen


Oben