Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Deserialisieren von nicht bekannten Objekten

Empfohlene Antworten

Veröffentlicht

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

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

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.