Java:序列化不';第二次不工作了
我有一台服务器,可以跟踪一些数据。当我使用管理员应用程序连接到服务器以检查数据的当前状态时。我使用5秒的刷新率。服务器第一次发送数据时,它就工作了。但是第二次,当数据更改时,管理员端没有收到最新的数据。我通过ObjectOutputStream和ObjectInputStream发送封装在类中的数据: 这是数据的包装类:Java:序列化不';第二次不工作了,java,serialization,garbage-collection,Java,Serialization,Garbage Collection,我有一台服务器,可以跟踪一些数据。当我使用管理员应用程序连接到服务器以检查数据的当前状态时。我使用5秒的刷新率。服务器第一次发送数据时,它就工作了。但是第二次,当数据更改时,管理员端没有收到最新的数据。我通过ObjectOutputStream和ObjectInputStream发送封装在类中的数据: 这是数据的包装类: public class Leerling implements Serializable { public int llnID; public Strin
public class Leerling implements Serializable {
public int llnID;
public String naam;
public String voornaam;
public String klas;
public int klasNummer;
public Date geboorteDatum;
public String getFullName()
{
return voornaam + " " + naam;
}
@Override
public String toString() {
return "Leerling{" + "llnID=" + llnID + ", naam=" + naam + ", voornaam=" + voornaam + ", klas=" + klas + ", klasNummer=" + klasNummer + ", geboorteDatum=" + geboorteDatum + '}';
}
}
public class SLeerling extends Leerling implements Serializable{
public boolean voted;
public int vote = -2;
}
我尝试的是在从流读取对象以调用System.gc()之前
以确保旧对象不再位于内存中。但是没有成功
有人知道确切的问题是什么吗?以及如何能够获得真实的最新数据
提前谢谢
问题的第二个例子:
class BrokenServer {
void sendBrokenVoteData(ObjectOutputStream out) {
out.writeObject(votes);
changeVoteData(votes);
out.writeObject(votes); // Writes a shared reference to "votes" WITHOUT updating any data.
}
}
class FixedServer {
void sendFixedVoteData(ObjectOutputStream out) {
out.writeObject(votes);
changeVoteData(votes);
out.reset(); // Clears all shared references.
out.writeObject(votes); // Writes a new copy of "votes" with the new data.
}
}
我还有一个用于其他数据的包装器类(它是一个内部类):
这是完美的。奇怪,如果你问我。代码的另一部分我几乎没做任何改动。。。(除了实现数组而不是列表)可能是
ObjectOutputStream
引起了问题
如果在服务器上使用单个ObjectOutputStream
对象,则需要确保在其上调用reset
,否则它会将共享引用写入以前写入的对象。这听起来像你看到的
为了说明这个问题:
class BrokenServer {
void sendBrokenVoteData(ObjectOutputStream out) {
out.writeObject(votes);
changeVoteData(votes);
out.writeObject(votes); // Writes a shared reference to "votes" WITHOUT updating any data.
}
}
class FixedServer {
void sendFixedVoteData(ObjectOutputStream out) {
out.writeObject(votes);
changeVoteData(votes);
out.reset(); // Clears all shared references.
out.writeObject(votes); // Writes a new copy of "votes" with the new data.
}
}
可能是
ObjectOutputStream
引起了问题
如果在服务器上使用单个ObjectOutputStream
对象,则需要确保在其上调用reset
,否则它会将共享引用写入以前写入的对象。这听起来像你看到的
为了说明这个问题:
class BrokenServer {
void sendBrokenVoteData(ObjectOutputStream out) {
out.writeObject(votes);
changeVoteData(votes);
out.writeObject(votes); // Writes a shared reference to "votes" WITHOUT updating any data.
}
}
class FixedServer {
void sendFixedVoteData(ObjectOutputStream out) {
out.writeObject(votes);
changeVoteData(votes);
out.reset(); // Clears all shared references.
out.writeObject(votes); // Writes a new copy of "votes" with the new data.
}
}
从您目前提供的信息来看,这听起来与序列化无关。这听起来更像是管理员页面上的缓存和刷新问题。如果刷新时接收到的数据已过时,仅刷新5秒钟是没有帮助的。请尝试在返回数据的末尾添加时间戳,以确保浏览器不会缓存它。@Michael:我没有使用浏览器。根据到目前为止您提供的信息,我使用自己的Java桌面应用程序(也不是小程序),这听起来与序列化无关。这听起来更像是管理员页面上的缓存和刷新问题。如果刷新时接收到的数据已过时,仅刷新5秒钟是没有帮助的。请尝试在返回数据的末尾添加时间戳,以确保浏览器不会缓存它。@Michael:我没有使用浏览器。我使用自己的Java桌面应用程序(也不是小程序)@jtahlborn
writeUnshared
在很大程度上是无用的。非共享是肤浅的,因为对象仍然指向的其他对象将被共享。@jtahlbornwriteUnshared
在很大程度上是无用的。“非共享”很浅,因为对象仍然指向的其他对象将被共享。