一、序列化与反序列化概念:
java序列化:也就是将java对象转换为字节序列。
java反序列化:也就是将字节序列转换为java对象。
那么我们的序列化和放序列化到底有什么作用呢,为什么要序列化和反序列化?
二、序列化和反序列化的作用:
1.可以把对象序列化后永久存储到硬盘上,通常存放在某一个文件里面。
2.将对象转换为网络传输对象的字节序列。
在很多场景下,需要对某些对象进行序列化,让它们离开内存空间,永久存放在物理硬盘,以便长期保存。例如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象反序列化还原到内存中。
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象序列化为字节序列,才能在网络上传送;接收方则需要把字节序列再反序列化为Java对象。
三、序列化操作:
java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列
化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反
序列化为一个对象,并将其返回。
只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,
实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。
四、实例代码:
序列化对象:
import java.io.Serializable;
public class Employee implements Serializable {
private String name;
private int age;
private String job;
private String gender;
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;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
序列化操作:
public class SerializeDemo
{
public static void main(String [] args)
{
Employee e = new Employee();
e.setName("德玛西亚");
e.setAge(22);
e.setJob("软件工程师");
e.setGender("男")
try
{
FileOutputStream fileOut =
new FileOutputStream("/tmp/employee.ser");//注意: 当序列化一个对象到文件时, 按照Java的标准约定是给文件一个.ser扩展名。
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in /tmp/employee.ser");
}catch(IOException i)
{
i.printStackTrace();
}
}
}
反序列化操作:
import java.io.*; public class DeserializeDemo { public static void main(String [] args) { Employee e = null; try { FileInputStream fileIn = new FileInputStream("/tmp/employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); e = (Employee) in.readObject(); in.close(); fileIn.close(); }catch(IOException i) { i.printStackTrace(); return; }catch(ClassNotFoundException c) { System.out.println("Employee class not found"); c.printStackTrace(); return; } System.out.println("Deserialized Employee..."); System.out.println("Name: " + e.getName()); System.out.println("Age: " + e.getAge()); System.out.println("Job: " + e.getJOb()); System.out.println("Gender: " + e.getGender()); } }