Java:序列化不';第二次不工作了

Java:序列化不';第二次不工作了,java,serialization,garbage-collection,Java,Serialization,Garbage Collection,我有一台服务器,可以跟踪一些数据。当我使用管理员应用程序连接到服务器以检查数据的当前状态时。我使用5秒的刷新率。服务器第一次发送数据时,它就工作了。但是第二次,当数据更改时,管理员端没有收到最新的数据。我通过ObjectOutputStream和ObjectInputStream发送封装在类中的数据: 这是数据的包装类: public class Leerling implements Serializable { public int llnID; public Strin

我有一台服务器,可以跟踪一些数据。当我使用管理员应用程序连接到服务器以检查数据的当前状态时。我使用5秒的刷新率。服务器第一次发送数据时,它就工作了。但是第二次,当数据更改时,管理员端没有收到最新的数据。我通过ObjectOutputStream和ObjectInputStream发送封装在类中的数据:

这是数据的包装类:

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
在很大程度上是无用的。非共享是肤浅的,因为对象仍然指向的其他对象将被共享。@jtahlborn
writeUnshared
在很大程度上是无用的。“非共享”很浅,因为对象仍然指向的其他对象将被共享。