频繁更改列表的序列化

时间:2014-05-25 09:50:21

标签: java serialization

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

首次完成此操作后,客户端会收到List(或者它是原始文件的/副本?),但在此之后,客户端的List永远不会更改服务器发送修改后的版本。服务器肯定会修改List,因为在调试器中观察它会清楚地显示修改。

客户端代码就像

List<Type> fromServer = new ArrayList<>();
...
// send information
...
fromServer = (List<Type>) in.readObject();

和服务器端一样

List<Type> toClient = new ArrayList<>();
...
// get information from client
// add/modify list elements
...
out.writeObject(toClient);

其中inout是套接字上的输入/输出流。

为什么会发生这种情况,我该怎么做才能解决这个问题?是否发生因为假设List没有变化?谢谢你的关注!

2 个答案:

答案 0 :(得分:1)

每当需要序列化同一对象的新版本时,您需要使用ObjectOutputStream.reset()

答案 1 :(得分:-1)

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

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

相反,我建议使用像Google Gsonjson-io这样的库来使用JSON序列化。期望线上(或调试器中)的数据要容易得多,并确保您收到的数据符合您的预期。它还允许您向前和向后兼容,包括不同版本的Java和您自己的数据结构。