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);
}