Изменение свойства объекта не сохраняется после потоковой передачи в Java
Обновление: ОК, поэтому я выделил части кода серым цветом и нашел причину проблемы. Я добавил сюда 3 строки кода с комментарием «это добавленный код, который вызывает проблему».
Но я до сих пор не понимаю, почему это влияет на результат.Я работаю над клиент-серверным приложением, которое отправляет объекты данных через ObjectOutputStream и ObjectInputStream.
Я заметил что-то странное, что заставило меня подумать, что я не совсем понимаю ссылки на объекты.
На стороне клиента у меня есть метод, который создает и возвращает объект User:
private static User createNewUser()
{
User newUser = new User();
newUser.name = "Jim";
newUser.phone = "054-6885644";
..
return newUser;
}
Я создаю объект User с помощью этого метода, изменяю одно из его свойств и отправляю его на сервер:
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??)
Итак, как вы можете видеть, перед тем как я передал объект в поток, свойства были обновлены. Но после того, как сервер десериализует его, он получает первоначальное значение свойства. Это почему?
Кстати, я пытался клонировать объект перед его передачей (создавая совершенно другой объект и просто копируя поля), и это сработало - значение правильности не вернулось.
Так почему это происходит? Почему изменение свойства ссылочного объекта не сохраняется после потоковой передачи?