Java ArrayList序列化文件写入使用ID并错误地记录更改项目

时间:2015-10-17 15:11:53

标签: java serialization file-io arraylist

我正在尝试使用ArrayList来记录Object更改为文件时的状态。我每次更改时都会将对象添加到文件中。当我在进程完成时回顾文件时,它只有对象的最新值的多个副本。我知道这可能是因为OutStream类使用对该对象的单个引用。这对于数据流来说很好,但对于文件输出却没用。我有什么想法可以解决这个问题?

    ArrayList <Reel> reels = new ArrayList<Reel> () ;
    Reel reel = new Reel();
        reel.name = "Default";
        reel.innerDiam = 125;
        reel.outerDiam = 200;
        reel.leftEdge = 150;
        reel.rightEdge = 300;
        reel.saved = false;     //reels = new Reel[100];
    reels.add(reel);
        reel.name = "LRF1A";
        reel.outerDiam = 225;
    reels.add(reel);    
    try { 
        ObjectInputStream reeliStream = new ObjectInputStream(new FileInputStream("Reels.ser"));
        reels = (ArrayList<Reel>) reeliStream.readObject();
    } catch (Exception eI) {
    System.out.println("Creating new Reels Repository File");
        try {
            ObjectOutputStream reeloStream = new ObjectOutputStream(new FileOutputStream("Reels.ser"));
            reeloStream.writeObject(reels);
        } catch (Exception eO){
            System.out.println("Failed to created new Reels Repository file.");
        }// try Read Reels
    }//Try Write Reels
    reel = reels.get(1);

2 个答案:

答案 0 :(得分:0)

在您的代码中

ArrayList <Reel> reels = new ArrayList<Reel> () ;
Reel reel = new Reel();
    reel.name = "Default";
    reel.innerDiam = 125;
    reel.outerDiam = 200;
    reel.leftEdge = 150;
    reel.rightEdge = 300;
    reel.saved = false;     //reels = new Reel[100];
reels.add(reel);
    reel.name = "LRF1A";
    reel.outerDiam = 225;
reels.add(reel);  

在数组列表中多次添加同一个对象,这会使列表中的所有条目都指向设置了最新值的同一对象。

ArrayList <Reel> reels = new ArrayList<Reel> () ;
    Reel reel = new Reel();
    reel.name = ...
    // Code
    reels.add(reel);

每次都应该创建一个不同的对象:

    reel = new Reel(); // NEW OBJECT
    reel.name = ...;
    // Code
    reels.add(reel);  

答案 1 :(得分:0)

经过多次思考,搜索和实验,我找到了解决这个问题的方法。我需要做的就是将reel对象的克隆添加到ArrayList。克隆是深度复制和暂时的,因为实际的克隆对象只存在于Reels类的调用方法中。

我将Reel类声明改为以

开头
public class Reel implements Cloneable{

克隆方法已添加到该类

    public Object clone(){
    Reel cloneReel;
    try{
        cloneReel = (Reel) super.clone();
    }
    catch (CloneNotSupportedException e){
        return null;  //never happens !?!
    }
    return cloneReel;
}

和&#39; reels.add(卷轴);&#39;行改为

reels.add((Reel)reel.clone());