2009-03-20 6 views
1

Ich habe eine Knotenstruktur aus Node-Objekten erstellt. Sie sind komplexer als der Code, den ich zeige, haben aber nur primitive oder serialisierbare Instanzmitglieder.Serialisierung speichert keine Objektdaten, nur Objektreferenzen

Angenommen jeder Knoten kann bis zu 10 Kinder haben, sieht der Code ein bisschen so aus.

public class Node implements Serializable{ 

    private static final long serialVersionUID = -848926218090221003L; 

private Node _parent; 
private boolean _hasParent; 
private Node[] _children; 
private int _childCount = 0; 

public Node(Node parent){ 

    _children = new Node[10]; 
    _parent = parent; 
    _hasParent = (parent != null); 
} 


    ... 

    //Various accessors etc 

} 

Jetzt ist dieser Baum recht teuer zu bauen, aber sobald es fertig ist, schreibe ich es in eine Datei:

ObjectOutputStream serializedOuput = new ObjectOutputStream(new FileOutputStream(cacheFile)); 
serializedOuput.writeObject(tree); 
serializedOuput.close(); 

Wenn ich den Baum fertig bin Cachen ich einige irreversable Änderungen ab mögen Trimmen nicht benötigte Zweige.

Wenn ich als nächstes einen Basisbaum brauche, um zu arbeiten, erstelle ich ein neues Baumobjekt, indem ich meine serialisierte Datei einlese.

Das Problem ...

Erstellen scheinen den Baum aus der Datei ein neues Objekt zu einfach zu erstellen, die auf den alten Punkte. Mit anderen Worten, die Änderungen, die nach dem Schreiben in die Datei vorgenommen wurden, wurden auch für den neuen Baum vorgenommen.

Wenn ich die App neu starte und versuche, in der serialisierten Datei zu lesen, wird null zurückgegeben.

Also ich scheinen Serialisierung Objektreferenzen eher als das Objekt selbst, irgendwelche Ideen, wo ich falsch liege?

Antwort

2

Funktioniert für mich, GNU/Linux with gij 4.3.2.

Stellen Sie sicher, dass alle Felder in der Knotenklasse serialisierbar sind.

Dies ist der Code, den ich versucht (sollte Ihr gleichwertig sein):

import java.io.*; 

public class TestCase { 
    public static void main(String[] args) { 
     try { 
      if (args.length > 0 && args[0].equals("read")) { 
       ObjectInputStream ois = new ObjectInputStream(
         new FileInputStream("File.log") 
        ); 
       Node root = (Node) ois.readObject(); 
       ois.close(); 

       System.out.println("Root value: " + root.getValue()); 
       for(Node n : root.children()) 
        System.out.println("Child: " + n.getValue()); 

       return; 
      } 

      Node root = new Node(null, "First"); 
      root.add(
        new Node(root, "Second.Child.1"), 
        new Node(root, "Second.Child.2") 
       ); 

      ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("File.log") 
       ); 
      oos.writeObject(root); 
      oos.close(); 
     } catch(Exception e) { 
      System.err.println(e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 
} 

class Node implements Serializable { 
    private static final long serialVersionUID = 2304728943L; 
    private Node _parent; 
    private Node[] _children; 
    private String _value; 

    public Node(Node parent, String value) { 
     this._parent = parent; 
     this._value = value; 
     this._children = new Node[2]; 
    } 
    public void add(Node child, Node child2) { 
     this._children[0] = child; 
     this._children[1] = child2; 
    } 
    public String getValue() { 
     return this._value; 
    } 
    public Node[] children() { 
     return this._children; 
    } 
    public Node parent() { 
     return this._parent; 
    } 
} 
+0

Das lässt mich denken, dass es etwas anderes ist, das dies verursacht. Ich muss tiefer graben, danke. –

1

Eine Sache, das Objekt ist Serialisierung kann tun, es zu ändern und sie dann auf den gleichen Strom Serialisierung. Sie müssen den Stream zurücksetzen, da sonst die Logik für die Verarbeitung nicht hierarchischer Strukturen Ihre Änderungen ignoriert. Andere Möglichkeiten sind Statik/Singleton oder seltsame Verwendung von readResolve.