A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴通 中级黑马   /  2012-9-9 23:07  /  1238 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴通 于 2012-9-11 21:57 编辑

要序列化Person对象
import java.io.*;
class Person implements Serializable
{
String name;
int age;
Person(String name,int age)
{
  this.name=name;
  this.age=age;
}

public String toString()
{
  return name+"::"+age;
}

public void run()
{
  System.out.println("person run");
}
}

通过序列化ObjectStream序列化之后,Person类的信息就存在文本中了,那么存在的信息中怎么没有方法信息?
还有就是字节流能够操作所有二进制数据,通过下面代码用字节流读取存储的文档为什么读取不到?
import java.io.*;
class ObjectStreamDemo2
{
public static void main(String[] args)throws Exception
{
  //writeObj();
  //readObj();
  read();
}
public static void writeObj()throws IOException
{
  ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("obj2.txt"));
  oos.writeObject(new Person2("lisi",39));
  oos.close();
}
public static void readObj()throws Exception
{
  ObjectInputStream ois=new ObjectInputStream(new FileInputStream("obj2.txt"));
  Person2 p=(Person2)ois.readObject();
  System.out.println(p);
  ois.close();
}
public static void read()throws IOException
{
  BufferedReader bufr=
   new BufferedReader(new FileReader("obj2.txt"));
  BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
  String line=null;
  while((line=bufr.readLine())!=null)
  {  
   if("over".equals(line))
    break;
   //System.out.println(line.toUpperCase());
   bufw.write(line);
   bufw.newLine();
   bufw.flush();
  }
  bufr.close();
  bufw.close();
}
}

1 个回复

倒序浏览
本帖最后由 陈振兴 于 2012-9-11 09:42 编辑

首先没有方法信息,Person2 p=(Person2)ois.readObject(); 你定义的Person,代码中Person2我不知道这是你测试用还是?
然后我来给你分析,剩下的代码正常运行!
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。(把你的Person类里面的成员变量name,age,序列化中就当做了两个对象转换成二进制
用在网络传输上,举个列子就是你登录网站的用户名、密码就是如此。这也正是利用Serializable长期存储把属性封装成为对象放在堆里面的主要原因,也正因为Java的堆是一个运行时数据区,类的对象从中分配空间。

我再来给你解释你提出的字节流来读取二进制数据?
public static void readObj() throws Exception {
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
                                "c:\\obj2.txt"));
                Perso p = (Perso) ois.readObject();  此方法是final,writeObject 和 readObject 方法为类重写默认的反序列化,这也正是以txt打开会乱码的原因(参看API上面的文字描述)
                System.out.println(p);
                ois.close();
        }

知识补充:利用final定义方法:这样的方法为一个不可覆盖的方法。
为了保证方法的一致性(即不被改变),可将方法用final定义。
如果在父类中有final定义的方法,那么在子类中继承同一个方法。
如果一个方法前有修饰词private或static,则系统会自动在前面加上final。即private和static方法默认均为final方法。

哎呀,今晚的一个多小时真值,共同学习!

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 很认真,很详细!加油!!!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马