1 @Data 2 static class SimplePOJO implements Serializable{ 3 String field1; 4 String field2; 5 public SimplePOJO(String s1, String s2) { 6 field1 = s1; 7 field2 = s2; 8 } 9 } 10 11 public static void main(String[] args) throws IOException, ClassNotFoundException { 12 //JDK自带序列化方法 13 FileOutputStream fos = new FileOutputStream("C:\\Users\\user\\Desktop\\student.dat"); 14 SimplePOJO student = new SimplePOJO("16","张三"); 15 ObjectOutputStream oos = new ObjectOutputStream(fos); 16 oos.writeObject(student); 17 oos.flush(); 18 oos.close(); 19 FileInputStream fis = new FileInputStream( "C:\\Users\\user\\Desktop\\student.dat"); 20 ObjectInputStream ois = new ObjectInputStream(fis); 21 SimplePOJO deStudent = (SimplePOJO) ois.readObject(); 22 ois.close(); 23 System.out.println(deStudent); 24 }我们用文本编辑器打开保存的中间文件student.dat看看(因为是字节流,会有乱码: 按照序列化协议的通用设计规则,会在首部包含数据的长度和首部长度。上图我们能明显看到类名和各个属性的类型和值,还能明显看到多个相同的间隔符。 实际上该序列化协议的格式为: 序列化过程就是在读取对象数据的时候,不断加入一些特殊分隔符,这些特殊分隔符用于在反序列化过程中截断用。 头部数据用来声明序列化协议、序列化版本,用于高低版本向后兼容。 对象数据主要包括类名、签名、属性名、属性类型及属性值,当然还有开头结尾等数据,除了属性值属于真正的对象值,其他都是为了反序列化用的元数据。 存在对象引用、继承的情况下,就是递归遍历“写对象”逻辑。
序列化-JDK自带Serializable
如下代码示例:实现了Serializable接口(强制)的类,可以通过ObjectOutputStream的writeObject()方法转为字节流。
字节流通过ObjectInputStream的readObject方法可以逆序列化为对象。