黑马程序员技术交流社区
标题:
对象序列化
[打印本页]
作者:
吴通
时间:
2012-9-9 23:07
标题:
对象序列化
本帖最后由 吴通 于 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();
}
}
作者:
陈振兴
时间:
2012-9-11 02:11
本帖最后由 陈振兴 于 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方法。
哎呀,今晚的一个多小时真值,共同学习!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2