在以下程序中。
public class SerialExample {
public static void main(String args[]) throws Exception{
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("out.txt"));
Car c = new Car(20);
os.writeObject(c);
c.setSpeed(30);
os.writeObject(c);
os.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream("out.txt"));
Car d = (Car)in.readObject();
Car e = (Car)in.readObject();
System.out.println(d.getSpeed() + " " + e.getSpeed());
in.close();
}
}
class Car implements Serializable{
private int speed;
Car(){
speed = 1;
}
Car(int speed){
this.speed = speed;
}
public int getSpeed(){
return speed;
}
public void setSpeed(int speed){
this.speed = speed;
}
}
上述程序的输出是 20 20。
这意味着当它第二次写入同一个对象而不是写入对象时,它已经编写了一个处理程序。
我怀疑JVM是如何跟踪已经将所有对象写入流中的?
答案 0 :(得分:7)
ObjectOutputStream类负责处理此逻辑。
来自Java Object Serialization FAQ:
ObjectOutputStream类跟踪它序列化的每个对象 如果将对象写入流a,则仅发送句柄 随后的时间。这是它处理对象图的方式。该 相应的ObjectInputStream跟踪它的所有对象 已创建和他们的句柄所以当再次看到句柄时它可以 返回相同的对象。输出和输入流都保持这种状态 直到他们被释放。