Java ArrayList序列化文件写入使用ID并错误记录更改项
我试图使用ArrayList记录对象更改为文件时的状态。每次对象更改时,我都会将其添加到文件中。当我在进程完成后回顾文件时,它只包含对象最新值的多个副本。我理解这可能是因为OutStream类使用了对对象的单个引用。这对于数据流来说是好的,但是对于文件输出来说是无用的。有没有办法解决这个问题Java ArrayList序列化文件写入使用ID并错误记录更改项,java,serialization,file-io,arraylist,Java,Serialization,File Io,Arraylist,我试图使用ArrayList记录对象更改为文件时的状态。每次对象更改时,我都会将其添加到文件中。当我在进程完成后回顾文件时,它只包含对象最新值的多个副本。我理解这可能是因为OutStream类使用了对对象的单个引用。这对于数据流来说是好的,但是对于文件输出来说是无用的。有没有办法解决这个问题 ArrayList <Reel> reels = new ArrayList<Reel> () ; Reel reel = new Reel(); r
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);
ArrayList-revels=new-ArrayList();
拨禾轮=新拨禾轮();
revel.name=“默认”;
卷筒内径=125;
卷筒外线=200;
reel.leftEdge=150;
Reveel.rightEdge=300;
reel.saved=错误//卷轴=新卷轴[100];
卷轴。添加(卷轴);
reveel.name=“LRF1A”;
卷筒外线=225;
卷轴。添加(卷轴);
试试{
ObjectInputStream reeliStream=新ObjectInputStream(新文件输入流(“Reels.ser”));
reels=(ArrayList)reeliStream.readObject();
}捕获(异常eI){
System.out.println(“创建新的卷存储库文件”);
试一试{
ObjectOutputStream reeloStream=新的ObjectOutputStream(新文件输出流(“Reels.ser”));
reeloStream.writeObject(卷);
}捕获(异常eO){
System.out.println(“未能创建新的卷存储库文件”);
}//试读卷轴
}//试着写卷轴
卷筒=卷筒。获取(1);
在您的代码中
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);
经过深思熟虑、探索和实验,我找到了解决这个问题的办法。我所需要做的就是将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;
}
和“卷轴。添加(卷轴);”行已更改为
reels.add((Reel)reel.clone());
谢谢你。每次我都必须为“reel”实例生成不同的名称以避免冲突,这将是一个问题,因为其他类会设置此对象的值。我在某处看到一个设置“reveel=null”的建议,这会产生相同的冲突问题。我想做的是reel.destroy,但java不支持。。。。嘿嘿。
public Object clone(){
Reel cloneReel;
try{
cloneReel = (Reel) super.clone();
}
catch (CloneNotSupportedException e){
return null; //never happens !?!
}
return cloneReel;
}
reels.add((Reel)reel.clone());