Zum Inhalt springen

Deserialisieren von nicht bekannten Objekten


Empfohlene Beiträge

Geschrieben

Hallo,

ich habe folgende Situation:

Wenn ich ein Java-Programm schreibe, kann ich Klassen als Objekte serialisieren und deserialisieren. Alles soweit in Ordnung. Bislang war aber immer in dem Java-Programm eine Klasse des serialisierten Objekt vorhanden, sodass ich wusste welche Methoden dieses Objekt hat.

Bsp: Klasse Kontakt war im Java-Projekt vorhanden, ich wusste das Objekt hat nach dem deserialisieren die methode "getAlter" oder so.

Meine Frage:

Kann ich ein unbekanntes Objekt deserialisieren (also dessen klasse ich auch nicht kenne) und abfragen welche Methoden mir zur verfügung stehen?

Danke schonmal für die Antworten.

Gruss

hexa

Geschrieben

Das ist jetzt eine Vermutung (spannende Frage übrigens), aber ich denke, es wird schief gehen. Beim Deserialisieren wird der Bytestrom des serialisierten Objekts gelesen und interpretiert. Interpretieren heißt in diesem Fall, der Classloader lädt die Klasse. Da er zur Klasse aber leider keine entsprechende Bytecodedatei hat, kann er sie in meinen Augen nicht laden.

Unter J2EE ist es möglich (JBoss, ich weiß nicht, ob das in der Spezifikation geregelt ist), dass ein Client die Klassen, die er gerade aus dem Application Server laden und verwenden will, nicht schon beim Start der VM zur Verfügung haben muss, sondern diese bei Bedarf nachzieht. Hier kann ich es mir so vorstellen, dass das geht, wenn ein eigener Classloader verwendet wird.

Probier doch den von Dir gewünschten Fall einfach mal aus und sag Bescheid, ob das geht, es würde mich interessieren.

Peter

Geschrieben

Das geht via Introspection / Reflection. Auch wenn die Klasse des zu deserialisierten Objektes nicht im Code bekannt sein muss, muss diese zumindest im Classpath liegen, sonst gibts eine ClassNotFoundException beim deserialisieren.

package de.tutorials;


import java.beans.BeanInfo;

import java.beans.Introspector;

import java.beans.PropertyDescriptor;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInput;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.lang.reflect.Method;


public class ObjectSerializationExample {

    public static void main(String[] args) throws Exception{

        Person p = new Person("Tom");


        String path = "/tmp/tom.ser";


        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));

        oos.writeObject(p);

        oos.close();


        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));

        Object o = ois.readObject();

        ois.close();


        System.out.println(o);

        System.out.println(o.getClass());

        //BeanInfo Introspection

        BeanInfo beanInfo = Introspector.getBeanInfo(o.getClass());

        for(PropertyDescriptor pd : beanInfo.getPropertyDescriptors()){

            System.out.println( pd.getName() + ": " +  pd.getReadMethod().invoke(o));

        }


        //Händische Reflection

        for(Method method : o.getClass().getDeclaredMethods()){

            System.out.println(method);

        }


    }

}
package de.tutorials;


import java.io.Serializable;


public class Person implements Serializable {

    String name;


    public Person() {

    }


    public Person(String name) {

        this.name = name;

    }


    public String getName() {

        return name;

    }


    public void setName(String name) {

        this.name = name;

    }


}

Wie gesagt, bei dieser methode muss ich eine.class datei besitzen...

Quelle: Deserialisieren von nicht bekannten Objekten - Java @ tutorials.de: Forum, Tutorial, Anleitung, Schulung & Hilfe

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...