本帖最后由 陈振兴 于 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方法。
哎呀,今晚的一个多小时真值,共同学习! |