我现在正在学习如何使用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();
}
}
}我创建了一个包含两个变量的代码:一个是string ( Class SterializeObject ),另一个是瞬态的int (代码)。然后,在主要部分,我生成了该类的两个实例,并尝试将其写入一个文件中,我已经成功地完成了!在此之后,我尝试使用循环读取两个对象。这就是我的问题。因为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我得到了对象,但我得到了一个错误,因为,我认为,是试图访问不存在的东西。
有没有人能告诉我其他的方法?
诚挚的问候。
发布于 2013-04-03 21:09:53
读取与写入对象数量一样多的对象,或者写入对象列表本身,而不是一个接一个地写入每个对象。
(或者依靠EOFException来检测流的结束,但这很难看)。
发布于 2013-04-05 22:55:12
正如你们许多人告诉我的那样,我创建了一个ArrayList并序列化了ArrayList。我的代码是:
public class MainClass {
public static void main(String[] agrs) {
SterializeObject ob1 = new SterializeObject("ana", 1);
SterializeObject ob2 = new SterializeObject("rita", 2);
ArrayList <SterializeObject> list = new ArrayList<>();
list.add(ob1);
list.add(ob2);
ArrayList <SterializeObject> input = new ArrayList<SterializeObject>();
try {
FileOutputStream fileOut = new FileOutputStream("file.data");
ObjectOutputStream outObj = new ObjectOutputStream(fileOut);
outObj.writeObject(list);
outObj.close();
System.out.println("Objects were serialized!");
} catch (IOException e) {
e.printStackTrace();
}
try {
FileInputStream fileInput = new FileInputStream("file.data");
ObjectInputStream inputObj = new ObjectInputStream(fileInput);
Object o;
try {
input = (ArrayList<SterializeObject>) inputObj.readObject();
} 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 < input.size(); ++i) {
input.get(i).printAtributes();
}
}
}输出结果是:对象已序列化!名称: ana;编码:0名称: rita;编码:0
谢谢你的帮助!
发布于 2013-04-03 21:11:01
与ObjectOutputStream一起关闭FileOutputStream
fileOut.close();https://stackoverflow.com/questions/15788182
复制相似问题