h3xagon Geschrieben 7. Mai 2009 Geschrieben 7. Mai 2009 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 Zitieren
kingofbrain Geschrieben 8. Mai 2009 Geschrieben 8. Mai 2009 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 Zitieren
h3xagon Geschrieben 8. Mai 2009 Autor Geschrieben 8. Mai 2009 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 Zitieren
Empfohlene Beiträge
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.