我有一个客户端/服务器程序,我ObjectOutputStream
通过writeObject()
和发送对象readObject()
。
我发送的对象是由几个字段和另一个内部对象组成的类(让我们调用外部对象Wrapper
和内部对象Inner
。两个自定义对象都实现serializable
.
我第一次发送Wrapper
过来时,一切正常。存储在两者Wrapper
中的所有内容,Inner
所有字段都可以毫无问题地进行序列化和反序列化。
但是,当客户端随后修改Inner
类,将其放入 中Wrapper
并再次发送时,Inner
服务器接收到的实例与第一次接收到的实例相同。
我的客户:
Inner inner = new Inner();
inner.setValue("value");
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(new Wrapper(inner));
服务器:
ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream());
Wrapper wrapper = (Wrapper) in.readObject();
String value = wrapper.getInner().getValue();
Inner
客户端然后用不同的字符串(即包含其他字母然后第一个)修改类(与以前相同的实例):
inner.setValue("newValue");
out.writeObject(new Wrapper(inner));
但是,当我查看inner.getValue()
服务器上的 时,它并没有改变,仍然等于"value"
.
在发送之前,我通过制作内部类的硬拷贝解决了这个问题:
Inner newInner = new Inner();
newInner.setValue("newValue");
out.writeObject(new Wrapper(newInner));
现在,新值已按应有的方式更新。
为什么序列化以这种方式工作?