对象的序列化机制
允许把内存中的java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,或者通过网络将这种二进制流传输到另一个网络节点,当其他程序获取到了这种二进制流,就可以恢复成原来的java对象。
在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。
只有实现了Serializable或者Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。
public class Cat extends Animal implements Serializable {
//实现了接口还要写一个序列化版本号,随便写。不写自动生成,不写反序列容易出问题
public static final long serialVersionUID=546556666l;
@Override
public void eat(){
System.out.println("猫吃了东西");
}
public void sleep(){
System.out.println("猫在猫床上睡觉");
}
}
序列化
//将java内存中的对象保存到磁盘中或者通过网络传输
try {
ObjectOutputStream oos =new ObjectOutputStream(new FileOutputStream("D:\\1java\\aaa.dat"));
oos.writeObject(new String("这是一段文字"));
oos.flush();//刷新
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
反序列化
//将磁盘中的对象数据反序列化到java对象中
try {
ObjectInputStream ooi =new ObjectInputStream(new FileInputStream("D:\\1java\\aaa.dat"));
String o = (String)ooi.readObject();
ooi.close();
System.out.println(o);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}