在java中进行流式处理后,不会保存对象属性更改

在java中进行流式处理后,不会保存对象属性更改,java,io,objectoutputstream,Java,Io,Objectoutputstream,更新: 好的,我已经将部分代码灰显,并找到了导致问题的原因。 我在这里添加了3行代码,注释为“这是导致问题的添加代码” 但我仍然不明白为什么它会影响结果。 我正在开发一个客户机-服务器应用程序,它通过ObjectOutputStream和ObjectInputStream发送数据对象 我注意到一些奇怪的事情,这让我觉得我可能无法完全理解对象引用 在客户端,我有一个创建并返回用户对象的方法: private static User createNewUser() { User newUse

更新: 好的,我已经将部分代码灰显,并找到了导致问题的原因。 我在这里添加了3行代码,注释为“这是导致问题的添加代码”

但我仍然不明白为什么它会影响结果。 我正在开发一个客户机-服务器应用程序,它通过ObjectOutputStream和ObjectInputStream发送数据对象

我注意到一些奇怪的事情,这让我觉得我可能无法完全理解对象引用

在客户端,我有一个创建并返回用户对象的方法:

private static User createNewUser()
{
    User newUser = new User();

    newUser.name = "Jim";
    newUser.phone = "054-6885644";
    ..

    return newUser;
}
我使用此方法创建用户对象,更改其属性之一并将其发送到服务器:

User user = createNewUser();

out.writeObject(user); // this is the added code that causes the problem
out.flush(); // this is the added code that causes the problem

system.out.println("old phone number: " + user.phone); // this prints out 054-6885644
user.phone = "052-9008801";
system.out.println("new phone number: " + user.phone); // this prints out 052-9008801

out.writeObject(user);
out.flush();
在服务器端,我读取对象:

User user = (User) in.readObject(); // this is the added code that causes the problem

User newProfile = (User) in.readObject();
System.out.println("phone number: " + newProfile.phone); // this prints out 054-6885644 (why??)
如您所见,在我流化对象之前,属性已更新。但在服务器对其进行反序列化后,它将获得原始属性值。 为什么呢

顺便说一句,我尝试在流式传输对象之前克隆该对象(创建一个完全不同的对象并只是复制字段),结果成功了——Property值没有恢复


那么为什么会发生这种情况呢?为什么流传输后未保存对引用对象属性的更改?

使用输出对象时,实例将被序列化(如预期的那样)。问题是,序列化版本将被缓存,并且无论何时尝试第二次写入同一实例,都会引用序列化实例的缓存版本


为了避免这种情况,您可以在调用
writeObject(Object)
后调用,也可以使用

我使用两个不同的项目在我的系统上复制了它,然后服务器打印出新的号码。请创建产生相同问题的,以确保您可能正在编写的其他代码没有问题。@VinceEmigh,谢谢您的建议。我添加了3行代码来复制问题。通过流发送的对象被缓存。当您第二次发送对象时,我相信OOS使用的是缓存的值,而不是具有新phone值的对象。在第二次发送对象之前,请尝试调用
out.reset()
。如果这有效,让我知道,我会把它作为一个例子answer@VinceEmigh这确实解决了问题。非常感谢。