一、什么是序列化,反序列化。
序列化就是将对象转化成二进制字节码。反序列化就是把二进制字节码重新转化成对象。
二、为什么需要序列化
举个例子,我们需要在网络上传输我们的对象中的状态数据,但是网络中只能传输二进制字节码,所以这时候就需要通过序列化对象技术来把我们的对象信息转化成二进制字节码,把我们的二进制字节码传输到接收方,接收方再通过反序列化将接收的二进制字节码转换成具有状态数据的对象。还有一种情况是我们需要持久化我们的对象信息,通过序列化可以把对象信息保存到文件中。
序列化的原理就是把我们的对象相关的所有信息(包括类信息,对象状态信息)通过一定的格式组织起来,输出到相应的输出流中。具体关于Java序列化的内部原理可参考 深入学习Java序列化
三、如何进行序列化
Java默认序列化:Java的默认的序列化方式需要继承Serializable接口
1 /** 2 * @author jacken 3 * @date 2018/04/29 4 */ 5 public class Person implements Serializable { 6 7 private String name; 8 private Integer age; 9 10 public String getName() { 11 return name; 12 } 13 14 public void setName(String name) { 15 this.name = name; 16 } 17 18 public Integer getAge() { 19 return age; 20 } 21 22 public void setAge(Integer age) { 23 this.age = age; 24 } 25 }
1 package com.jacken.test.serialize; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.ObjectOutputStream; 8 9 /** 10 * @author jacken 11 * @date 2018/04/20 12 */ 13 public class Serialize { 14 15 public static void main(String[] args) { 16 try (FileOutputStream fileOutputStream = new FileOutputStream( 17 new File("/Users/Shared/test.txt"))) { 18 ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); 19 Person person = new Person(); 20 person.setAge(11); 21 person.setName("test"); 22 objectOutputStream.writeObject(person); 23 objectOutputStream.flush(); 24 objectOutputStream.close(); 25 } catch (FileNotFoundException e) { 26 e.printStackTrace(); 27 } catch (IOException e) { 28 e.printStackTrace(); 29 } 30 } 31 32 }
反序列化
1 package com.jacken.test.serialize; 2 3 import com.alibaba.fastjson.JSON; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.FileNotFoundException; 7 import java.io.IOException; 8 import java.io.ObjectInputStream; 9 10 /** 11 * @author jacken 12 * @date 2018/04/20 13 */ 14 public class Serialize { 15 16 public static void main(String[] args) { 17 try (FileInputStream fileInputStream = new FileInputStream(new File("/Users/Shared/test.txt"));) { 18 ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); 19 Person deserializePerson = (Person) objectInputStream.readObject();
21 } catch (FileNotFoundException e) { 22 e.printStackTrace(); 23 } catch (IOException e) { 24 e.printStackTrace(); 25 } catch (ClassNotFoundException e) { 26 e.printStackTrace(); 27 } 28 } 30 }
这是Java的默认的序列化方式,当然也可以使用Json、Protobuf、Thrift、Marshlling等框架进行序列化,不同的序列化方式就是将对象转换成字节码的组织格式的不同。