tiefe Kopie nicht serialisierbarer Objekte

Status
Nicht offen für weitere Antworten.

Enton

Mitglied
Hallo,
ich möchte ein Objekt, welches wiederum auf andere objekte zugreift kopieren. Es soll eine tiefe Kopie sein, damit die Daten erhalten bleiben.
haben es so probiert:
Java:
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.IOException;

public class TiefeKopie {
    public static Object kopiere(Object einObjekt)
            throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);

        oos.write(einObjekt);

        ByteArrayInputStream bais =
                new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);

        return ois.readObject();
    }
}
Anmerkung: Bei komplexen Objekten, die viele Referenzen auf andere Objekte besitzen schlägt das Verfahren meist fehl. Der Serialisierungsmechanismus verwendet Rekursion, um alle referenzierten Objekte zu speichern. Wird auf Objekte referenziert, die wieder auf Objekte referenzieren usw. kann es geschehen, daß der Stack-Speicher für die Rekursion überläuft.

Da ich solche komplexe Objekte benutze, funktioniert es also nicht.
clone() habe ich auch versucht aber keinen Erfolg gehabt. Was gibt es sonst für Möglichkeiten?
 
Zuletzt bearbeitet von einem Moderator:
Serialisierung ist doch kein Griff in eine Tüte, zu dem es auch noch SerialisierungB, SerialisierungC, Xy und ABC gibt,

Serialisierung steht für das Konzept, die Objekte automatisiert zu verarbeiten, sich den Klassenbau anzuschauen und Stück für Stück Elemente herauszunehmen und einzeln zu kopieren,
Alternativen dazu gibt es exakt keine

außer bekannten eigene Konstruktionen a la
if (objekt ist KlasseX) {
kopiereSpeziellEinKlasseXObjekt();
}

oder eine leichte Modifikation der Serialisierung, also einen ählichen rekursiven automatisierten Ablauf, der nur bestimmte Dinge anders behandelt,
was immer du konkret für Probleme hast,
was soll denn mit den nicht-serialisierbaren Objekten passieren? normalerweise bedeutet das auch nicht-kopierbar, oder wie willst du einen laufenden Thread kopieren

> kann es geschehen, daß der Stack-Speicher für die Rekursion überläuft.

suchst du eine Serialisierung, die nur dieses Problem umgeht?
da kann ich nicht weiterhelfen, mein schöner Vortrag ist eher umsonst 😉

vielleicht reicht es die Stack-Tiefe zu erhöhen
 
Zuletzt bearbeitet von einem Moderator:
Du kannst auch per Reflection tiefe Kopien erzeugen, allerdings ist das die langsamste Variante.

Der oben geschriebene Code ist übrigens schlecht, weil die Streams nie geschlossen werden. Streams werden erst ab Java 7 automatishc geshclossen.
 
Hallo,
leider helfen mir die Antworten nicht wirklich weiter. Werde wohl nochmal versuchen, dass Problem zu umgehen.
Trotzdem Danke für die Antworten.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben