0x00 版权声明
JAVA基础系列是笔者学习@炼石星球的笔记,大部分文字描述取自星球内发布的教程文件,仅作学习。
0x01 概念简介
01 序列化
序列化是指为了便于保存在内存、文件、数据库种把Java对象转换为字节序列的过程。ObjectOutputStream 类的 writeObject() 方法可以实现序列化
1
| public final void writeObject(Object obj) throws IOException
|
一个类的对象需要满足两个条件才能完成序列化:
- 该类必须实现 java.io.Serializable 接口
- 该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的
02 反序列化
反序列化是指把字节序列恢复为 Java 对象的过程。
ObjectInputStream 类的 readObject() 方法可实现反序列化。
1
| public final Object readObject() throws IOException,classNotFoundException
|
0x02 Demo
01 序列化
首先创建一个Maven项目,默认配置,等待创建完成。
在src.main.java目录新建HackInfo.class,键入代码:
1 2 3 4
| public class HackInfo implements java.io.Serializable{ public String id; public String team; }
|
在java目录新建SerializeDemo.class,键入代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; public class SerializeDemo { public static void main(String [] args) throws IOException { HackInfo hack = new HackInfo(); hack.id = "zebra"; hack.team = "Zebra Team"; FileOutputStream fileOut = new FileOutputStream("C:\\\\Users\\\\admins\\\\Desktop\\\\serializedata.txt"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(hack); out.close(); fileOut.close(); System.out.println("序列化的数据已经保存在了serializedata.txt文件 中"); } }
|
运行SerializeDemo,在桌面会出现一个txt文件,用Winhex打开:
序列化的数据会有明显的特征,都是以 ac ed 00 05 73 72 开头的
02 反序列化
在java目录新建DeserializeDemo.class文件,键入代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; public class DeserializeDemo { public static void main(String[] args) throws IOException, ClassNotFoundException { HackInfo hack = null; FileInputStream fileIn = new FileInputStream("C:\\\\Users\\\\admins\\\\Desktop\\\\serializedata.txt"); ObjectInputStream in = new ObjectInputStream(fileIn); hack = (HackInfo) in.readObject(); in.close(); fileIn.close(); System.out.println("Deserialized Employee..."); System.out.println("Name: " + hack.id); System.out.println("Address: " + hack.team); } }
|
运行项目: