Deserialisieren von nicht bekannten Objekten

h3xagon

Grünschnabel
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
 
Hallo,

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.

Java:
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);
        }
        
    }
}

Java:
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;
    }

}

Gruß Tom
 
Zurück