2012-04-10 13 views
2

Es wird eine sehr grundlegende Frage sein, denke ich, aber ich habe nach der Antwort für Stunden gesucht und ich kann einfach nicht herausfinden, wo mein Code falsch läuft. Also: Ich serialize ein Objekt namens SerializableObject, dann lies es zurück. In der Deserialisierungsmethode erhalte ich ein temporäres Objekt, das ich in ein anderes neues SerializeableObject kopieren möchte, das ich nachher verwenden möchte, aber ich kann es nicht richtig kopieren, aber das temporäre Objekt hat die Werte richtig bei der Deserialisierung erhalten. Hier sind meine Klassen: SeralizeableObject:Kann Werte nicht richtig eingeben Serialisierung

public class SerializableObject implements Serializable, Cloneable{ 

private Vector<int[]> mixMade; 
private Vector<int[]> stepsMade; 
private long time; 
private int steps; 
private int winnerState; 

public SerializableObject(Vector<int[]> mixMade, Vector<int[]> stepsMade, 
long time, int steps, int winnerState) { 
    this.mixMade = mixMade; 
    this.stepsMade = stepsMade; 
    this.time = time; 
    this.steps = steps; 
    this.winnerState = winnerState; 
} 

@Override 
public String toString() { 
    String str = ""; 
    for(int[] mixEl : mixMade){ 
     str += mixEl[0] + ", " + mixEl[1] + "|"; 
    } 
    str += " mixes\n"; 
    for(int[] stepEl : stepsMade){ 
     str += stepEl[0] + ", " + stepEl[1] + "|"; 
    } 
    str += " steps\n"; 
    str += "time: " + time + ", stepsnum: " + steps + ", 
winstate: " + winnerState; 
    return str; 
}  

@Override 
public SerializableObject clone() { 
    SerializableObject serObj; 
    Vector<int[]> mixMadeTemp = new Vector<int[]>(); 
    Vector<int[]> stepsMadeTemp = new Vector<int[]>(); 
    for(int i = 0; i < mixMade.size(); ++i){ 
     mixMadeTemp.add(mixMade.get(i)); 
    } 
    for(int i = 0; i < stepsMade.size(); ++i){ 
     stepsMadeTemp.add(stepsMade.get(i)); 
    } 
    serObj = new SerializableObject(mixMadeTemp, stepsMadeTemp, 
time, steps, winnerstate); 
    return serObj; 
} 

}

Der Serializator:

public class ObjectSerializator { 

public ObjectSerializator() { 

} 

public void toFile(String filepath, SerializableObject serObj){ 
    ObjectOutputStream out; 
    try{ 
     FileOutputStream fileOut = new FileOutputStream(filepath); 
     out = new ObjectOutputStream(fileOut); 
     out.writeObject(serObj); 
    }catch (IOException ex) { 

    }  
} 

public void fromFile(String filepath, SerializableObject serObj){ 
    SerializableObject tempSerObj; 
    try { 
     FileInputStream fileIn = new FileInputStream(filepath); 
     ObjectInputStream in = new ObjectInputStream(fileIn); 

     tempSerObj = (SerializableObject) in.readObject(); 
     System.out.println(tempSerObj + "TEMP"); 
     serObj = tempSerObj.clone(); 

     in.close(); 
     fileIn.close(); 
    } catch (IOException ex) { 

    } catch (ClassNotFoundException ex) { 

    } 
} 

}

Anmerkung: die serobj Referenzpunkte richtig auf die guten Werte innerhalb der fromfile Methode Eine Dateichooser-Klasse, in der der Benutzer die zu ladende Datei auswählen kann:

public class FileChooser extends JFileChooser{ 

private ObjectSerializator serializator; 

public FileChooser() { 
    serializator = new ObjectSerializator(); 
} 

public void load(SerializableObject serObj){ 
     int retValue = showOpenDialog(null); 
     serializator.fromFile(getSelectedFile().getAbsolutePath(), serObj); 
}} 

als in meinem mainfram nenne ich es von einem buttonaction

public void load(){ 
    SerializableObject serObj = new SerializableObject(new Vector<int[]>(), new 
Vector<int[]>(), 10, 10, 200); 
    fileChooser.load(serObj); 
    System.out.println(serObj + " LAST"); 
} 

Hier ist meine Ausgabe:

3, 2|4, 3| mixes 

0, 0|0, 1|0, 0| steps 

time: 6000, stepsnum: 3, winstate: 0TEMP 

------------------- 

mixes 

steps 

time: 10, stepsnum: 10, winstate: 200 LAST 

Antwort

1

Das Objekt, das Sie verloren deserialisiert wird haben.

In Ihrer fromFile Methode haben Sie die folgende Zeile ein:

serObj = tempSerObj.clone(); 

Aber serObj ist ein Argument für die Methode. Die obige Zeile ändert die lokaleserObj Variable, während das ursprüngliche Objekt intakt bleibt. Die aufrufende Methode (load) enthält immer noch einen Verweis auf das alte (ursprüngliche) Objekt.

Ihre fromFile Methode sollte kein SerializableObject als Argument akzeptieren; eher sollte es eins zurückgeben. Dann sollte die FileChooser.load Methode es auch zurückgeben. Schließlich sollte die load Methode des Hauptrahmens in etwa so aussehen:

public void load() { 
    SerializableObject originalObject = new SerializableObject(new Vector<int[]>(), new Vector<int[]>(), 10, 10, 200); 
    // Here you can do something with the newly created object, such as save it to a file. 

    SerializableObject deserializedObject = fileChooser.load(); 
    System.out.println(deserializedObject + " LAST"); 
} 
+0

Java-Grundlagen wie ich dachte. Allerdings ist es unhöflich, weil die loadchoosers-Methode nur eine Datei auswählt und sie dem Serializator gibt, um nichts zurückzugeben, weshalb ich diese Lösung nicht verwenden wollte. –

Verwandte Themen