黑马程序员技术交流社区

标题: 关于对象序列化的问题 [打印本页]

作者: ☆星痕泪    时间: 2013-12-6 16:00
标题: 关于对象序列化的问题
本帖最后由 ☆星痕泪 于 2013-12-6 18:17 编辑

在序列化对象后存储进了硬盘,关于这个对象的疑问,比如老师将Person序列化,里面的实例变量也保存了。
只存储一个对象,取出来也是一个。
那连续存储几个对象呢?我连续存储几个,但是反序列化后只能得到一个。
oos.writeObject(new Person("lisi",22));
oos.writeObject(new Person("wangwu",23));
oos.writeObject(new Person("zhangsan",22));
。。。
这写入的同一类型不同对象,它是不是装一个文件里的?每个对象是不是都有自己对应的UID?
另外在读取时,像上面我读一个就只能打印一个,读两个只能打印两个
Person p1 = (Person)ois.readObject();
sop(p1);
Person p2 = (Person)ois.readObject();
sop(p2);
能不能一次性全部读取呢?怎么读?
我试着用BufferedInputStream,但是没法。
老师那里貌似没有细讲,求解答啊

补充:
刚刚的确米有将清楚,上百度和问群里的好友已经解决了。
问题实际上很简单就是:怎么用readObject读取到一个文件对象中的多个对象?
我把代码贴出。若有不对地方多谢提醒。
  1. /*
  2. 因为readObject返回值是Object,数组也是Object子类
  3. 所以想要取出一个文件中的多个对象,可以在序列化之前把多个对象封装进对象数组
  4. 再序列化,反序列化就只需要这个对象数组即可。然后将对象数组遍历出来
  5. */
  6. import java.io.*;
  7. import java.util.*;
  8. class Person implements Serializable
  9. {
  10.         //根据原理UID,我们可以固定标示,对于private私有后变量也可不影响。
  11.         public static final long serialVersionUID = 42L;
  12.          String name;
  13.          int age;
  14.         Person(String name,int age)
  15.         {
  16.                 this.name = name;
  17.                 this.age = age;
  18.         }
  19.         public String toString()
  20.         {
  21.                 return name+":"+age;        
  22.         }
  23. }
  24. class Demo1
  25. {
  26.         public static void main(String[] args) throws Exception
  27.         {
  28.                 writeObj();
  29.                 readObj();
  30.         }
  31.         public static void writeObj()throws Exception
  32.         {
  33.                 //创建序列化之前的对象数组,并确定其长度,即对象有几个
  34.                 Person[] p = new Person[3];
  35.                 //通过循环构造每一个对象
  36.                 for (int x=0;x<p.length ;x++ )
  37.                 {
  38.                         p[x] = new Person("zhangsan",22);
  39.                 }
  40.                 //先指定目的文件
  41.                 FileOutputStream fos = new FileOutputStream("file.Object");
  42.                 //new对象将目的文件对象传入
  43.                 ObjectOutputStream oos = new ObjectOutputStream(fos);
  44.                 //将内存中的对象写入
  45.                 oos.writeObject(p);
  46.                 oos.close();
  47.         }
  48.         public static void readObj()throws Exception
  49.         {
  50.                 ObjectInputStream ois =
  51.                         new ObjectInputStream(new FileInputStream("file.object"));
  52.                 //反序列化读指定文件,出的是对象数组,所以需要向下转型。
  53.                 Person[] p2 = (Person[])ois.readObject();
  54.                 //将对象数组遍历取出
  55.                 for(Person p:p2)
  56.                 {
  57.                         System.out.println(p.toString());
  58.                 }
  59.                 ois.close();
  60.         }
  61. }
复制代码



作者: 王家胜    时间: 2013-12-6 17:26
源代码完全贴出来我来改
作者: wangchao1686    时间: 2013-12-6 17:44
问题描述的不太清楚,估计是你的写入方式有问题,我想问题在于是不是写入流有覆盖操作。如果有覆盖操作,自然最后只有一个对象喽。
作者: ☆星痕泪    时间: 2013-12-6 18:11
王家胜 发表于 2013-12-6 17:26
源代码完全贴出来我来改

谢谢啊,盆友。已经解决了。
作者: ☆星痕泪    时间: 2013-12-6 18:12
wangchao1686 发表于 2013-12-6 17:44
问题描述的不太清楚,估计是你的写入方式有问题,我想问题在于是不是写入流有覆盖操作。如果有覆盖操作,自 ...

刚刚没表达好,现在问题解决了,哎,花了我好多时间今天时间又费了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2