【问题标题】:Can't give values properly trougth serialization无法通过序列化正确给出值
【发布时间】:2012-04-10 11:38:47
【问题描述】:

我想这将是一个非常基本的问题,但我一直在寻找答案几个小时,我就是无法弄清楚我的代码哪里出错了。所以:我确实序列化了一个名为 SerializableObject 的对象,而不是读回它。在反序列化方法中,我得到一个临时对象,我想将其复制到另一个新的SerializeableObject,之后我想使用它,但我无法正确复制它,但是临时对象正确地获取了值,在反序列化。这是我的课程: 可序列化对象:

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

}

序列化器:

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

    }
}

}

注意:在 fromFile 方法中,serobj 引用正确地指向正确的值 一个文件选择器类,用户可以在其中选择要加载的文件:

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

这是我的输出:

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

【问题讨论】:

    标签: java serialization reference copy clone


    【解决方案1】:

    你反序列化的对象丢失了。

    在您的 fromFile 方法中,您有以下行:

    serObj = tempSerObj.clone();
    

    但是serObj 是该方法的参数。上面的行改变了 local 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");
    }
    

    【讨论】:

    • Java 基础知识如我所想。但是我很粗鲁,因为 filechoosers 加载方法只是选择一个文件,并将其交给序列化器,而不是返回任何东西,这就是我不想使用这个解决方案的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多