背景以及意义
远程通信中,无论何种类型的数据都是以二进制的形式在网络中传输。发送方需要将java对象转换为字节序列;接收方需要将字节序列回复为Java对象。或者是将某些对象进行序列化,以便长期保存到物理硬盘。比如Web服务器中的session对象,当有海量用户并发访问时,会有大量的Session对象,内存是无法容下的。
概念
序列化:把Java对象转换成字节序列的过程
反序列化:把字节序列恢复为Java对象的过程
如何序列化?
只有实现了Serializable和Externalizable接口的类的对象才能被序列化。实现了Externalizable的类完全由自身控制序列化行为,而仅实现Serializable接口的类可以采用默认的序列化方式。
对象序列化的步骤:
创建一个对象输出流,可以包装一个其他类型的输出流,如文件输出流;通过对象输出流的writeObject()方法写出对象。对象反序列化的步骤:
创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;通过对象输入流的readObject()方法读取对象。举例说明:
实现了Serializable接口的Person类
package 序列化练习;import java.io.Serializable;public class Person implements Serializable { String name; int age; public Person(String name, int age){ this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }序列化以及反序列化测试:package 序列化练习;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.SerializablePermission;public class ObjSerializeDeserialize { static String pathname = "resource/Person.txt"; public static void main(String[] args) throws Exception{ serializePerson(); Person p = deserializePerson(); System.out.PRintln(p.name+" "+p.age); } public static void serializePerson() throws FileNotFoundException, IOException{ Person p = new Person("owen",24); ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File(pathname))); oo.writeObject(p); System.out.println("Serialize successfully!"); oo.close(); } public static Person deserializePerson() throws FileNotFoundException, IOException, ClassNotFoundException{ ObjectInputStream oi = new ObjectInputStream(new FileInputStream(new File(pathname))); Person p = (Person) oi.readObject(); System.out.println("Deserialize successfully!"); return p; }}
新闻热点
疑难解答