373 Stimmen

Wie erstellt man eine Tiefenkopie eines Objekts?

Es ist etwas schwierig, eine tiefe Objektkopierfunktion zu implementieren. Wie stellen Sie sicher, dass das Originalobjekt und das geklonte Objekt keine gemeinsame Referenz haben?

4voto

supernova Punkte 2864

Ich habe Planierraupe für das Klonen von Java-Objekten und es ist großartig darin, Kryo Bibliothek ist eine weitere gute Alternative.

2voto

Alfergon Punkte 5177

BeanUtils leistet wirklich gute Arbeit beim Tiefklonen von Bohnen.

BeanUtils.cloneBean(obj);

1voto

Arun Punkte 903

1)

public static Object deepClone(Object object) {
   try {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     ObjectOutputStream oos = new ObjectOutputStream(baos);
     oos.writeObject(object);
     ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
     ObjectInputStream ois = new ObjectInputStream(bais);
     return ois.readObject();
   }
   catch (Exception e) {
     e.printStackTrace();
     return null;
   }
 }

2)

    // (1) create a MyPerson object named Al
    MyAddress address = new MyAddress("Vishrantwadi ", "Pune", "India");
    MyPerson al = new MyPerson("Al", "Arun", address);

    // (2) make a deep clone of Al
    MyPerson neighbor = (MyPerson)deepClone(al);

Hier müssen die Klassen MyPerson und MyAddress die Schnittstelle serilazable implementieren

1voto

Unmitigated Punkte 45447

Hier ist eine generische Deep-Cloning-Methode, die Objektserialisierung und -deserialisierung mit Byte-Array-Streams verwendet (um das Schreiben in eine Datei zu vermeiden).

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

@SuppressWarnings("unchecked")
public static <T extends Serializable> T deepClone(T t) {
    try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);) {
        oos.writeObject(t);
        byte[] bytes = baos.toByteArray();
        try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
            return (T) ois.readObject();
        }
    } catch (IOException | ClassNotFoundException e) {
        throw new RuntimeException(e);
    }
}

1voto

Fahad Israr Punkte 721

Eine sehr schnelle und einfache Ein-Zeilen-Lösung könnte die Verwendung von Jackson sein.

Schauen Sie sich das Beispiel-Snippet an:

ObjectMapper objectMapper = new ObjectMapper();

MyClass deepCopyObject = objectMapper
  .readValue(objectMapper.writeValueAsString(originalObject), MyClass.class);

Im obigen Beispiel : " MyClass " bezieht sich auf die Klasse des Objekts, das kopiert werden soll.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X