我有一个客户端/服务器程序,我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));
现在,新值已按应有的方式更新。
为什么序列化以这种方式工作?