为什么写回两个不同Streams的单个对象在回读时代表两个不同的对象?

Rek*_*kha 4 java serialization

标题告诉我的需要,以下是我使用的代码:

测试用例

SameObjectDifferentStreams same = new SameObjectDifferentStreams(); 
ObjectOutputStream out1 = new ObjectOutputStream(new FileOutputStream("file1"));
ObjectOutputStream out2 = new ObjectOutputStream(new FileOutputStream("file2"));

out1.writeObject(same);
out1.close();

out2.writeObject(same);
out2.close();

System.out.println("The Original reference is :" + same.toString());

oin1 = new ObjectInputStream(new FileInputStream("file1"));
oin2 = new ObjectInputStream(new FileInputStream("file2"));

SameObjectDifferentStreams same1 = 
    (SameObjectDifferentStreams) oin1.readObject();
System.out.println("The First Instance is :" + same1.toString());

SameObjectDifferentStreams same2 = 
    (SameObjectDifferentStreams) oin2.readObject();
System.out.println("The Second Instance is :" + same2.toString());
Run Code Online (Sandbox Code Playgroud)

产量

The Original reference is :serialization.SameObjectDifferentStreams@9304b1
The First Instance is :serialization.SameObjectDifferentStreams@190d11
The Second Instance is :serialization.SameObjectDifferentStreams@a90653
Run Code Online (Sandbox Code Playgroud)

Ale*_*exR 6

当您将对象写入流时,您实际上序列化,即仅写入其数据.然后,当您阅读它时,您将读取数据并创建新对象.就像new MyObject()使用适当的构造函数参数调用一样.显然,这里创建了新对象.

如果您两次读取相同的序列化对象,则创建两次新实例.这两个实例是相等的,即它们的所有字段都相等,但引用不同,因此表达式o1==o2返回false,而(如果实现合理的equals()方法)则o1.equals(o2)返回true.