我现在正在学习如何使用Java
语言进行序列化。我已经阅读了一些有关该主题的帖子和文档,并且尝试做一个简单的示例(如下)
public class SterializeObject implements java.io.Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private transient int code;
public SterializeObject (String n, int c){
name = n;
code = c;
}
public void printAtributes (){
System.out.println("name: " + name + "; code: " + code);
}
}
public class MainClass {
public static void main(String[] agrs) {
SterializeObject ob1 = new SterializeObject("ana", 1);
SterializeObject ob2 = new SterializeObject("rita", 2);
try {
FileOutputStream fileOut = new FileOutputStream("file.data");
ObjectOutputStream outObj = new ObjectOutputStream(fileOut);
outObj.writeObject(ob1);
outObj.writeObject(ob2);
outObj.close();
System.out.println("Objects were serialized!");
} catch (IOException e) {
e.printStackTrace();
}
ArrayList<SterializeObject> list = new ArrayList<SterializeObject>();
try {
FileInputStream fileInput = new FileInputStream("file.data");
ObjectInputStream inputObj = new ObjectInputStream(fileInput);
Object o;
try {
while ((o = inputObj.readObject()) != null) {
list.add((SterializeObject) o);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("Erro foi aqui! (1)");
}
inputObj.close();
fileInput.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("Erro foi aqui! (2)");
}
for (int i = 0; i < list.size(); ++i) {
list.get(i).printAtributes();
}
}
}
我创建了一个 Class SterializeObject
,它使用两个变量实现 java.io.Serialized
:一个 string
(名称)和一个 int
(代码)是 transient 的。然后,我主要生成该类的两个实例,并尝试将其写入文件中,我已经成功完成了!之后,我尝试用循环读取两个对象..这是我的问题..因为ObjectInputStream
没有某种方法来查看我们是否最终。因此,我尝试处理以下条件:(o = inputObj.readObject()) != null
。
My output is this:
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at MainClass.main(MainClass.java:30)
Objects were serialized!
Erro foi aqui! (2)
name: ana; code: 0
name: rita; code: 0
我得到了对象,但收到错误,因为我认为,正在尝试访问不存在的东西。
有人可以告诉我其他方法吗?
最诚挚的问候。
最佳答案
读取与写入对象数量一样多的对象,或者写入对象列表本身,而不是一个接一个地写入每个对象。
(或者依靠 EOFException 来检测流的结束,但这很难看)。
关于Java序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15788182/