【发布时间】:2012-06-07 21:12:17
【问题描述】:
我尝试编写一个密钥持有者,我想使用 ObjectOutputStream 将密码写入 .dat 文件,然后使用 ObjectInputStream 读取它们。这是我编写对象的代码:
public void toFile()
{
try
{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("passwords.dat"));
for(int i = 0; i<this.nrOfPW; i++)
{
if(this.PWlist[i] instanceof longPW)
{
oos.writeObject((longPW)this.PWlist[i]);
}
else
{
oos.writeObject((PinPW)this.PWlist[i]);
}
}
oos.close();
}
catch(IOException e)
{
e.getStackTrace();
}
}
这似乎可行,但是当我尝试再次读取文件并将对象放入我的 PWlist 数组中时,它说 PinPW 不可序列化,即使 PinPW 实现了 Serializable 并且已导入。 PinPW (Info) 的基类也实现了 Serializable 并导入它。这是我读取文件的代码:
public void fromFile()
{
try
{
ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("passwords.dat"));
while(objIn.readObject() != null)
{
if(this.nrOfPW == this.PWlist.length)
{
expand(10);
}
if(objIn.readObject() instanceof PinPW)
{
this.PWlist[this.nrOfPW] = (PinPW)objIn.readObject();
this.nrOfPW++;
}
else
{
this.PWlist[this.nrOfPW] = (longPW)objIn.readObject();
this.nrOfPW++;
}
}
objIn.close();
}
catch(EOFException e)
{
e.getStackTrace();
}
catch(IOException ex)
{
ex.printStackTrace();
}
catch(ClassNotFoundException ex)
{
ex.printStackTrace();
}
}
PWlist数组是Info数组,PinPW和longPW扩展了Info。
我该怎么做才能解决这个问题?
【问题讨论】:
-
您能否发布生成的异常和堆栈跟踪 - 请参阅我的答案以了解可能解决此问题的方法以及 确定 修复错误。
-
[Off-topic] 按照惯例,Java 类使用 UppercaseStartingCamelCase 命名——这意味着您的
longPW类应该是LongPW。同样,变量使用小写StartingCamelCase 命名,因此您的PWList变量应称为pwList。 -
您可以简化创建文件的方法。调用
writeObject时不需要检查对象的类型,也不需要强制转换,因为这里的参数是Object。您必须确保所有传递的对象都实现接口java.io.Serializable,因为这不是编译器强制执行的(它是由序列化输出流强制执行的)。
标签: java objectoutputstream objectinputstream