当前位置: 首页 > 面试题库 >

Java:序列化第二次不起作用

何晗昱
2023-03-14
问题内容

我有一台服务器,可以跟踪一些数据。当我使用管理员应用程序连接到服务器以检出数据的当前状态时。我使用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();以确保对象旧对象不再在内存中。但是没有成功。

有人知道确切的问题是什么吗?以及如何使其能够获取真实的最新数据?

提前致谢。

问题的第二个例子:

我又有一些其他数据的包装器类(这是一个内部类):

public static class MonitorResponse implements Serializable
{
    public int numberOfLLN;
    public int blocked;
    public int blancos;
    public List<Integer> votes;
}

当我第一次发送数据时,它可以工作。但是,第二次发送(更新)时,除以外的所有内容List<Integer> votes都会更新。所以votes不刷新。然后我通过用数组替换List来解决这个问题:

public static class MonitorResponse implements Serializable
{
    public int numberOfLLN;
    public int blocked;
    public int blancos;
    public Integer[] votes;
}

这很完美。如果你问我,那很奇怪。代码的另一部分我几乎什么都没改变…(除了实现数组而不是List之外)


问题答案:

可能是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.
    }
}


 类似资料:
  • 问题内容: 我对文件进行迭代有问题。这是我在解释器上键入的内容和结果: 当我尝试再次遍历同一个打开的文件时,我什么也没得到! 根本没有输出。为了解决这个问题,我必须对文件进行编辑,然后再次将其打开以进行读取!那是正常行为吗? 问题答案: 是的,这是正常行为。基本上,你是第一次读取文件的末尾(可以像读取磁带一样对它进行图片处理),因此除非你使用重定位到文件开头的位置进行重置,否则你将无法从文件中读取

  • 我尝试做什么: 我希望HashSet中充满程序不知道的新词。用户按下主机上的“转换”按钮。带有单词的文件的路径在主框架上给出。 如果单词是新单词,则会打开一个J对话框并要求插入新单词(因此您可以更改拼写,例如第一个字母大…)。 如果用户按下JDialog上的“写入”按钮,该单词将添加到HashSet中。 但是如果我在那之后打印我的HashSet,则只显示“旧”值。当我第二次按下主框架上的“转换”按

  • 本文向大家介绍Java,C#使用二进制序列化、反序列化操作数据,包括了Java,C#使用二进制序列化、反序列化操作数据的使用技巧和注意事项,需要的朋友参考一下 java使用二进制序列化、反序列化的操作首先,要引入java.io下面相关包,或者直接写import java.io.*; 下面,为了书写操作的方便,采用复制文件,和throws声明异常的方式来写 初略代码,仅供参考! C#使用二进制序列化

  • 我试图使用MathJax将HTML文本框(Tex)中键入的方程视为数学方程。如果没有正确地查看方程,我需要编辑方程,并在数学方程中查看它。 第一次,它工作正常。但是在执行编辑后,Mathjax排版命令显示错误。请您检查一下,并建议可能的错误。 我使用的HTML是: 我使用的脚本是: 当我第二次单击按钮时,它会显示以下错误: 未捕获的TypeError:无法在l.append(tex mml cht

  • 嗨,我刚开始冬眠。我正在尝试一个示例程序,当我第二次执行代码时,hibernate没有创建表并挂起。当我单击数据库表时,数据库挂起。 我使用的是PostgreSQL-9.3.3-1版本和hibernate-release-4.3.4.final。 2.我的POJO课。我在pojo类中使用注释 userdetails.java } null

  • 我已经在google上搜索了将近一天这个问题,并尝试了几个修复(包括StackOverflow的4或5个),但都没有成功。我有一个带注释的POJO,用于Jackson 2.10.2 我使用这个POJO为一些外部请求创建XML。一切都很好,但现在我需要重新排序生成的XML中的字段,似乎什么都不起作用。 我首先尝试在班级层面进行设置: 然后,我尝试使用以下命令设置每个字段的顺序: 我还尝试在所有字段上