Java 频繁更改列表的序列化

Java 频繁更改列表的序列化,java,serialization,Java,Serialization,我有一个服务器应用程序和一个客户机应用程序,并且服务器上存在一个列表(一个数组列表)。客户机向服务器发送一些信息,服务器修改列表的部分内容,并通过网络将其序列化发送给客户机 第一次执行此操作时,客户机会收到列表(或者它是原始列表的副本/引用?),但在这之后,客户机的列表不会更改,尽管服务器会发送修改后的版本。服务器肯定在修改列表,因为在调试器中查看它可以清楚地显示修改 客户端代码如下 List<Type> fromServer = new ArrayList<>(); .

我有一个服务器应用程序和一个客户机应用程序,并且服务器上存在一个
列表
(一个
数组列表
)。客户机向服务器发送一些信息,服务器修改
列表的部分内容
,并通过网络将其序列化发送给客户机

第一次执行此操作时,客户机会收到
列表
(或者它是原始列表的副本/引用?),但在这之后,客户机的
列表
不会更改,尽管服务器会发送修改后的版本。服务器肯定在修改
列表
,因为在调试器中查看它可以清楚地显示修改

客户端代码如下

List<Type> fromServer = new ArrayList<>();
...
// send information
...
fromServer = (List<Type>) in.readObject();
List fromServer=new ArrayList();
...
//发送信息
...
.readObject()中的fromServer=(List);
和服务器端类似

List<Type> toClient = new ArrayList<>();
...
// get information from client
// add/modify list elements
...
out.writeObject(toClient);
List-to-client=new-ArrayList();
...
//从客户处获取信息
//添加/修改列表元素
...
out.writeObject(到客户端);
其中,
in
out
是套接字上的输入/输出流


为什么会发生这种情况?我可以做些什么来解决此问题?是否因为假定
列表
未更改而发生这种情况?谢谢你的关注

我建议您停止使用内置对象序列化。它有严重的缺点:

  • 它使用难以调试的二进制格式
  • 它依赖于版本:客户端和服务器都需要运行相同版本的Java
  • 对数据结构的更改可能会导致客户端和服务器之间不兼容

相反,我建议使用类似或的库来使用JSON序列化。在线路上(或调试器中)期望数据更容易,并确保您接收的数据是您期望的数据。它还允许您与不同版本的Java和您自己的数据结构向前和向后兼容。

您需要在需要序列化同一对象的新版本时使用它。

您在调试器中到底看到了什么?每次客户端调用服务器时,它都会收到一个全新的列表,该列表存储在
fromServer
变量中,放弃对以前列表的引用-任何时候都不会修改任何单个列表。因此,如果您存储了对原始列表的引用,并且在调用后再次检查该列表,则不会看到它发生更改。第(2)点不正确。第(3)点既不是“可能”也不是“不可能”:它完全取决于变化是什么。好的,这是可行的,但实际问题是什么?不应该检测到修改过的对象吗?请参阅链接的Javadoc。序列化不会重新序列化已序列化的对象,除非使用
reset()
writeUnshared()。