# Objekt kopieren



## PollerJava (6. Mai 2008)

hallo, 
mit einer Serialisierung kopiere ich meine Objekte wie folgt:


```
public static Object deepCopy(Object o) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            new ObjectOutputStream( baos ).writeObject( o );
            ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );
            return new ObjectInputStream(bais).readObject();
            }
        catch (IOException e) {
            e.printStackTrace();
            }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
            }
        return null;
    }
```

Wenn ich ein umfangreiches Object habe, dann dauert das kopieren eines einzigen Objektes schon mal 500ms (laut Profiler) und wenn ich dann 40 Objekte zu kopieren  habe dann warte ich eine ganze Zeit, bis das kopieren fertig ist,
Kann ich da was machen, damit das schneller geht oder muss ich mir eine andere Kopiermethode schreiben bzw, überschreiben?

Vielen Dank,


----------



## SlaterB (6. Mai 2008)

schau doch mal nach, wie groß das Array ist, 
überlege, ob du wirklich alle referenzierten Objekte mitkopieren willst,

wenn alle 40 Objekte den gleichen großen Rest-Datenklumpen referenzieren,
dann wird der 40x aufwendig kopiert (und ist dann 40x doppelt im Speicher)
da bietet es sich an, alle 40 gleichzeitig zu speichern, dann wird nur einmal kopiert wobei selbst dann schon fraglich ist,
ob diese 40 Daten nicht lieber die Original-Restdaten referenzieren sollten


----------



## PollerJava (6. Mai 2008)

ich kopiere Nodes eines JTrees und das ist unbedingt erforderlich, dass ich da alle Nodes die ich brauche, kopiere, es sind nicht immer 40, es können auch mal 20 oder 10 sein aber es können eben auch 40 Nodes sein, das blöde ist, dass mein Projekt schon sehr weit fortgeschritten ist und das ich alles mit den DefaultMutableTreeNodes gemacht habe ansonsten hätte ich ja auch von DefaultMutableTreeNode ableiten können und das interface Cloneable implementieren können,

Gibts noch eine Change, dass ich das um einiges Beschleunigen kann?


----------



## SlaterB (6. Mai 2008)

du meinst, außer meiner vollständigen Antwort, die du dezent ignorierst?


----------



## André Uhres (6. Mai 2008)

PollerJava hat gesagt.:
			
		

> das blöde ist, dass mein Projekt schon sehr weit fortgeschritten ist und das ich alles mit den DefaultMutableTreeNodes gemacht habe ansonsten hätte ich ja auch von DefaultMutableTreeNode ableiten können und das interface Cloneable implementieren können,


Ich würde sagen, mit einer guten IDE lässt sich so ein Refactoring schnell machen.


----------



## PollerJava (6. Mai 2008)

ich weiß nicht genau wie du das meinst, ich benötige unbeding 40 unabhängige Objekte die nicht auf die originalen Objekte verweisen, Könntest du mir da ein Beispiel geben, Mein Code schaut momentan so aus:


```
Das folgende Programmstück findet in einer while- schleife statt: 

DefaultMutableTreeNode node = (DefaultMutableTreeNode)deepCopy(butNode);   // Node kopieren
node.getFirstLeaf().setUserObject("irgendwasanderesRein");                                  // das erste Blatt des Nodes verändern
treeModel.insertNodeInto(node, parentNode, 0);                       // den neuen, kopieren Node in meinen JTree einfügen
```


----------



## SlaterB (6. Mai 2008)

in meinem Posting stand ja auch, dass du die Menge der referenzierten Daten prüfen und überdenken sollst

wenn es viele sind und du immer noch sagst, dass das so sein muss,
dann gehts nicht schneller, auch wenn du mit 100 Seiten Code tausende Objekte einzeln kopierst


----------



## PollerJava (6. Mai 2008)

ok es dauert 16s, dann muss man die halt warten, is eh eine Spezialfunktion in meinem Programm, das muss es dann wert sein,


----------



## byte (6. Mai 2008)

16s für 40 Objekte ist definitiv viel zu lange. Bin mir ziemlich sicher, dass es an deinem Code liegt. Auf den ersten Blick fällt mir sofort auf, dass Du die Streams nie schließt. Auf jeden Fall jeden Stream mit close() schließen, wenn er nicht mehr gebraucht wird. Und den ObjectOutputStream würde ich mal flushen nach dem Schreiben.

Wenn das nichts hilft, vergleiche Deinen Code mal hiermit:
http://www.javaworld.com/javaworld/javatips/jw-javatip76.html?page=2


----------

