序列化:JVM如何跟踪已将所有对象写入流中

时间:2011-10-07 20:19:53

标签: java serialization

在以下程序中。

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是如何跟踪已经将所有对象写入流中的?

1 个答案:

答案 0 :(得分:7)

ObjectOutputStream类负责处理此逻辑。

来自Java Object Serialization FAQ

  

ObjectOutputStream类跟踪它序列化的每个对象   如果将对象写入流a,则仅发送句柄   随后的时间。这是它处理对象图的方式。该   相应的ObjectInputStream跟踪它的所有对象   已创建和他们的句柄所以当再次看到句柄时它可以   返回相同的对象。输出和输入流都保持这种状态   直到他们被释放。