在序列化对象时,引用是保留还是创建新对象?

时间:2015-07-16 01:45:37

标签: java object serialization save

这可能听起来像一个显而易见的问题,但我想知道序列化是否会导致引用另一个的对象变成副本而不是引用。

如果我不清楚,请考虑以下代码:

public class Test implements Serializable {
    String thing1 = new String("test");
    String thing2 = thing1;
    public static void main(String[] args) {
        //Blah blah implementation
    }
    public static void serialize() {
        try {
            FileOutputStream fileoutput = new FileOutputStream(new File("test.ser"));
            ObjectOutputStream objectoutput = new ObjectOutputStream(fileoutput);
            objectoutput.writeObject(thing2);
            objectoutput.close();
            fileoutput.close();
        } 
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        catch (IOException i) {
            i.printStackTrace();
        }
    }
}

反序列化后,它会作为对thing1的引用返回,还是只是一个副本,但不会引用它。

2 个答案:

答案 0 :(得分:1)

序列化的东西2确实无法保留对thing1的引用。这是因为序列化过程将thing2转换为字节流,表示thing2是其实例的类的对象的状态和内容。如果对象包含其他对象,则它们也必须可序列化以进行序列化而不会失败。而且他们的状态又被序列化了。

但是不保留对象及其内容在序列化时的特定内存地址。毕竟序列化的对象可以写入一个文件,该文件在序列化的程序之后会持续执行。

反序列化又将字节流转换回具有该序列化状态的该类实例的副本。

所以不,它只是反序列化的副本,并且不会保留对从其复制的同类型对象的引用。

答案 1 :(得分:0)

我不知道答案,但应该很容易测试。反序列化并测试==,如果结果为真,则完全相同。

如果字符串不是同一个实例,则==将为false,而equals将为true。