【问题标题】:Upon the serialization of an object does the reference stay or create a new object?在对象序列化时,引用是保留还是创建一个新对象?
【发布时间】:2015-07-16 01:45:36
【问题描述】:

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

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

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的引用返回还是只是一个副本,但不被引用。

【问题讨论】:

    标签: java object serialization save


    【解决方案1】:

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

    但是对象在被序列化时的具体内存地址及其内容并没有被保留。毕竟,一个序列化的对象可以写入一个文件,该文件在序列化它的程序停止执行后仍然存在。

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

    所以不,它只是反序列化的副本,不会保留对另一个与其复制来源相同类型的对象的引用。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-07-15
        • 1970-01-01
        • 1970-01-01
        • 2011-11-18
        • 2011-11-28
        • 2015-05-02
        • 1970-01-01
        • 2012-07-07
        • 2019-09-23
        相关资源
        最近更新 更多