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?

10voto

Ravi Chinoy Punkte 165

Ein sehr einfacher Ansatz ist die Verwendung von Jackson JSON, um komplexe Java-Objekte in JSON zu serialisieren und zurückzulesen.

Von https://github.com/FasterXML/jackson-databind/#5-minute-tutorial-streaming-parser-generator :

JsonFactory f = mapper.getFactory(); // may alternatively construct directly too

// First: write simple JSON output
File jsonFile = new File("test.json");
JsonGenerator g = f.createGenerator(jsonFile);
// write JSON: { "message" : "Hello world!" }
g.writeStartObject();
g.writeStringField("message", "Hello world!");
g.writeEndObject();
g.close();

// Second: read file back
JsonParser p = f.createParser(jsonFile);

JsonToken t = p.nextToken(); // Should be JsonToken.START_OBJECT
t = p.nextToken(); // JsonToken.FIELD_NAME
if ((t != JsonToken.FIELD_NAME) || !"message".equals(p.getCurrentName())) {
   // handle error
}
t = p.nextToken();
if (t != JsonToken.VALUE_STRING) {
   // similarly
}
String msg = p.getText();
System.out.printf("My message to you is: %s!\n", msg);
p.close();

8voto

Adisesha Punkte 5110

XStream( verwenden http://x-stream.github.io/ ). Sie können sogar steuern, welche Eigenschaften Sie durch Anmerkungen oder die explizite Angabe des Eigenschaftsnamens in der XStream-Klasse ignorieren können. Außerdem müssen Sie die Schnittstelle clonable nicht implementieren.

6voto

Orion Adrian Punkte 18345

Tiefgreifendes Kopieren ist nur mit Zustimmung der einzelnen Klassen möglich. Wenn Sie die Kontrolle über die Klassenhierarchie haben, können Sie die Schnittstelle clonable implementieren und die Methode Clone implementieren. Andernfalls ist es unmöglich, eine tiefe Kopie zu erstellen, da das Objekt auch Nicht-Daten-Ressourcen (z. B. Datenbankverbindungen) gemeinsam nutzen kann. Generell gilt das tiefe Kopieren in der Java-Umgebung jedoch als schlechte Praxis und sollte durch entsprechende Entwurfspraktiken vermieden werden.

6voto

Karthik Rao Punkte 199

Verwendung von Jackson zur Serialisierung und Deserialisierung des Objekts. Bei dieser Implementierung ist es nicht erforderlich, dass das Objekt die Klasse Serializable implementiert.

  <T> T clone(T object, Class<T> clazzType) throws IOException {

    final ObjectMapper objMapper = new ObjectMapper();
    String jsonStr= objMapper.writeValueAsString(object);

    return objMapper.readValue(jsonStr, clazzType);

  }

6voto

import com.thoughtworks.xstream.XStream;

public class deepCopy {
    private static  XStream xstream = new XStream();

    //serialize with Xstream them deserialize ...
    public static Object deepCopy(Object obj){
        return xstream.fromXML(xstream.toXML(obj));
    }
}

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