2012-04-10 41 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方法内 一个文件选择器类,其中用户可以选择要加载的文件:

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

比我mainfram我把它从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"); 
} 

这里是我的输出:

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

你反序列化对象丢失。

在你fromFile方法,你有下面这行:

serObj = tempSerObj.clone(); 

serObj是一个参数传递给方法。上面的行更改了本地serObj变量,而原始对象保持不变。调用方法(load)仍保留对旧(原始)对象的引用。

您的fromFile方法不应接受SerializableObject作为参数;相反,它应该返回一个。然后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加载方法只是选择一个文件,并将其提供给序列化程序,而不是放弃任何内容,这就是为什么我不想使用此解决方案。 – 2012-04-11 10:11:48