Java序列化是指把Java对象转换为字节序列的过程,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
而Java反序列化是指把字节序列恢复为Java对象的过程。对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
ObjectOutputStream类writeObject() 方法可以实现序列化;ObjectInputStream类的readObject()方法可以实现反序列化。
序列化和反序列化可以理解为“写”和“读“的操作
//写入对象内容 private void writeObject(java.io.ObjectOutputStream out) //读取对象内容 private void readObject(java.io.ObjectInputStream in)
需要注意的:
Information.java
//定义了Information类,该类实现了Serializable接口 public class Information implements java.io.Serializable{ public String name; //构造函数,初始化时执行 public Information(String name){ this.name=name; } }
SerializableDemo.java
import java.io.*; public class SerializeDemo { public static void main(String [] args) { Information e = new Information("H4rdy"); try { //创建一个包含序列化对象的数据文件 FileOutputStream fileOut = new FileOutputStream("/tmp/information.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); //将序列化的内容写入文件 out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Serialized data is saved in /tmp/information.ser"); }catch(IOException i) { i.printStackTrace(); } } }
将Information类序列化后保存到/tmp/information.ser文件中,information.ser文件中的内容:
aced 0005 是Java序列化的特征,流量中可以根据该特征发现序列化痕迹.
DeserializableDemo.java
import java.io.*; public class DeserializeDemo { public static void main(String [] args) { Information e = null; try { FileInputStream fileIn = new FileInputStream("/tmp/information.ser"); ObjectInputStream ins = new ObjectInputStream(fileIn); //读取字节序列并反序列重建对象 e = (Information) ins.readObject(); ins.close(); fileIn.close(); }catch(IOException i) { i.printStackTrace(); return; }catch(ClassNotFoundException c) { System.out.println("Information class not found"); c.printStackTrace(); return; } System.out.println("Deserialized Information..."); //恢复对象 System.out.println("Name: " + e.name); } }
读取information.ser并反序列化。
重写readObject方法,从而执行自己的代码。
Information.java
import java.io.IOException; public class Information implements java.io.Serializable{ public String name; //重写readObject方法 private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException{ //执行默认的readObject()方法以便完成反序列化操作 in.defaultReadObject(); //执行打开计算器程序命令 Runtime.getRuntime().exec("open /Applications/Calculator.app/"); } public Information(String name){ //构造函数,初始化时执行 this.name=name; } }