2012-04-10 20 views
2

これは非常に基本的な質問ですが、私は答えを数時間探しています。私のコードがどこに間違っているのか分かりません。だから:私はSerializableObjectと呼ばれるオブジェクトを、それを読んでからシリアル化します。デシリアライズメソッドでは一時オブジェクトを取得しますが、後で使用したい別の新しいSerializeableObjectにコピーしますが、正しくコピーできませんが、デシリアライズ時に一時オブジェクトが正しく値を取得しています。ここに私のクラスです: SeralizeableObject:値を正しく与えることはできません。

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; 
} 

}

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) { 

    } 
} 

}

注:適切に良好な値をserobj基準点、fromFileのメソッド内 ファイル選択クラスでは、ロード先のファイルをchhoseすることができます。

012私mainframに比べ
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); 
}} 

私は

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

buttonactionからそれを呼び出すここに私の出力です:

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 

答えて

1

あなたは、デシリアライズしましたオブジェクトが失われます。

serObj = tempSerObj.clone(); 

しかしserObjはメソッドの引数である:あなたのfromFile方法で

は、次の行を持っています。上記の行は、ローカルserObjの変数を変更しますが、元のオブジェクトは変更されません。呼び出し元のメソッド(load)は、古い(元の)オブジェクトへの参照を保持します。

fromFileメソッドでは、引数としてSerializableObjectを使用しないでください。むしろ、それは1つを返すべきです。次に、FileChooser.loadメソッドも同様にそれを返す必要があります。最後に、メインフレームのloadメソッドは、次のようになります。

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の基本は私が思ったとおりです。しかし、私は失礼です。なぜなら、filechoosersメソッドをロードするだけで、ファイルを選択してシリアライザに渡すだけで何も返さないからです。そのため、このソリューションを使用したくないのです。 –

関連する問題