Java-序列化-获取对象数 Java-序列化-获取文件中对象的数量

Java-序列化-获取对象数 Java-序列化-获取文件中对象的数量,java,serialization,Java,Serialization,我正在尝试从序列化文件中检索对象并将其重新添加到文件中。似乎有一个问题,在运行我的方法时,没有抛出异常,但控制台中没有打印任何内容。在继续之前,这里是我的代码: public boolean openCollection(){ try { FileInputStream e = new FileInputStream("profiles.ser"); ObjectInputStream inputStream =

我正在尝试从序列化文件中检索对象并将其重新添加到文件中。似乎有一个问题,在运行我的方法时,没有抛出异常,但控制台中没有打印任何内容。在继续之前,这里是我的代码:

public boolean openCollection(){
        try {
            FileInputStream e = new FileInputStream("profiles.ser");
            ObjectInputStream inputStream = new ObjectInputStream(e);
            List<Profile> profiles = (List<Profile>) inputStream.readObject();

            //De-obscure
            for(Profile p : profiles){
                String unObcName = deobscure(p.getName()); //Original name
                String unObcSurname = deobscure(p.getSurname()); //Original surname
                String unObcUsername = deobscure(p.getUsername()); //Original username
                String unObcPassword = deobscure(p.getPassword()); //Original password

                p.setName(unObcName);
                p.setSurname(unObcSurname);
                p.setUsername(unObcUsername);
                p.setPassword(unObcPassword);

                //Debugging
                System.out.println("DE-OBSCURE - Profile name: " + p.getName() +"\n"+
                        "Profile surname: " + p.getSurname() +"\n"+
                        "Profile username: " + p.getUsername() +"\n"+
                        "Profile password: " + p.getPassword());
                this.profiles.add(p);
            }

        } catch (FileNotFoundException var3) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JOptionPane.showMessageDialog(null, "No profiles found, please create a profile!");
                    final CreateProfile createProfile = new CreateProfile();
                    createProfile.setVisible(true);
                }
            });
            return false;
        } catch (IOException var4) {
            var4.printStackTrace();
            JOptionPane.showMessageDialog(null, "IO Exception");
            return false;
        } catch (ClassNotFoundException var5) {
            var5.printStackTrace();
            JOptionPane.showMessageDialog(null, "Required class not found");
            return false;
        }
    return true;
}
这是序列化方法

创建纵断面时,详细信息会被正确遮挡,结果如下:

调试-配置文件名称:OBF:1u2a1toa1w8v1tok1u30

个人资料姓氏:OBF:1u2a1toa1w8v1tok1u30

配置文件用户名:OBF:1u2a1toa1w8v1tok1u30

配置文件密码:OBF:1u2a1toa1w8v1tok1u30

但是,在运行openCollection时,控制台中没有打印任何内容


注意:配置文件的详细信息都是“admin”,这就是为什么所有数据看起来都一样的原因。检查了一段时间后,我发现问题仅仅是因为我的deobscuring方法。我现在对其进行了编辑,并将其替换为以下内容:

/**
 * @param str Obscured String
 * @return Unobscured String
 */
private String deobscure(String s){
    if (s.startsWith(__OBFUSCATE)) s = s.substring(4);

    byte[] b = new byte[s.length() / 2];
    int l = 0;
    for (int i = 0; i < s.length(); i += 4)
    {
        if (s.charAt(i)=='U')
        {
            i++;
            String x = s.substring(i, i + 4);
            int i0 = Integer.parseInt(x, 36);
            byte bx = (byte)(i0>>8);
            b[l++] = bx;

        }
        else
        {
            String x = s.substring(i, i + 4);
            int i0 = Integer.parseInt(x, 36);
            int i1 = (i0 / 256);
            int i2 = (i0 % 256);
            byte bx = (byte) ((i1 + i2 - 254) / 2);
            b[l++] = bx;
        }
    }

    return new String(b, 0, l,StandardCharsets.UTF_8);
}
原始配置文件名称:Admin

模糊外形名称:OBF:1npu1toa1w8v1tok1nsc

消除模糊后的配置文件名称:Admin


因此,该方法现在可以正常工作。

您是如何序列化的?没有检索对象数量的方法。这与河流的性质相反。如果你想要那个号码,你必须手动将它写入你的流中。艾略特我将把saveCollection添加到原始帖子中@Holger我也这么认为,我之前遇到的问题是openCollection会不断向我抛出一个EOFEException原因,就像你说的,没有一个直接的方法可以知道文件中有多少对象,所以readObject会耗尽对象并抛出异常,我发现异常非常烦人,不能让它一直在控制台中抛出异常,这让你的生活变得困难。与其写列表的大小,然后写列表中的每个元素,不如直接写列表本身。读取就像列表配置文件=List objectInputStream.readObject一样简单;也就是说,如果使用writeObject写入大小,则应使用readObject读取。read只读取一个字节。好的,谢谢JB,我会试试看
/**
 * @param str Obscured String
 * @return Unobscured String
 */
private String deobscure(String s){
    if (s.startsWith(__OBFUSCATE)) s = s.substring(4);

    byte[] b = new byte[s.length() / 2];
    int l = 0;
    for (int i = 0; i < s.length(); i += 4)
    {
        if (s.charAt(i)=='U')
        {
            i++;
            String x = s.substring(i, i + 4);
            int i0 = Integer.parseInt(x, 36);
            byte bx = (byte)(i0>>8);
            b[l++] = bx;

        }
        else
        {
            String x = s.substring(i, i + 4);
            int i0 = Integer.parseInt(x, 36);
            int i1 = (i0 / 256);
            int i2 = (i0 % 256);
            byte bx = (byte) ((i1 + i2 - 254) / 2);
            b[l++] = bx;
        }
    }

    return new String(b, 0, l,StandardCharsets.UTF_8);
}