Java 序列化 和 反序列化

Serializable And Deserialize

0.思维导图
Java 序列化 和 反序列化
三月 25, 2018. Created by XMind

1.Serializable
  • 中译:序列化
  • 含义:Java对象 转换成为字节序列的过程。
  • 作用:
    • 当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送
    • 发送方:需要把这个Java对象转换为字节序列,然后在网络上传送
  • 优势:
    • 实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘
    • 利用序列化实现远程通信,即在网络上传送对象的字节序列

    1.1 如何实现序列化
  • 1.实现序列化接口 implements Serializable。
  • 2.将实体对象进行序列化(输出流--写)。
    • 将文件输出流 ==>> 实体输出流
      • FileOutputStream fos = new FileOutputStream(File file);
      • ObjectOutputStream oos = new ObJectOutputStream(fos);
  • 3.将实体写入到对象输出流的当中
    • oos.writeObject(entiy)
      • writeObject(Object obj)方法:可以对参数指定的obj对象进行序化,把得到的字节序列写到一个目标输出流中。

package com.base.io;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.*;

/**
* Created by Calvin On 2017/12/19.
* 序列化
* 1.实现序列化接口 implements Serializable
* 2.将实体对象进行序列化(把得到的字节序列写到目标输出流中)
* 3.通了对象输出流写入实体到文件中去
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SerializableByEntiy implements Serializable {

private String name;
private String proprety;


public static void main(String[] args) {
SerializableByEntiy entiy = new SerializableByEntiy("序列化","序列化需要的属性");

try {
//在该文件路径下,创建一个新文件
File createFileByPath = new File("D:\\Eclipse_WorkSpace\\JAVA_SE\\SerializableDemon.txt");
Boolean createResult = createFileByPath.createNewFile();

if (createResult == false){
System.out.println("创建失败");
}else{
System.out.println("创建成功: " + createFileByPath.toString());
}

//实体对象序列化过程(将文件输出流 转化为 对象输出流)
FileOutputStream fos = new FileOutputStream(createFileByPath); //文件输出流
ObjectOutputStream oos = new ObjectOutputStream(fos); //对象输出流

oos.writeObject(entiy); //实体写入
oos.flush(); //清空对象输出流
oos.close(); //关闭对象输出流
fos.close(); //关闭文件输出流

} catch (IOException e) {
e.printStackTrace();
}

}

}

结果: 打开SerializableDemon.txt文件

2.Deserialize
  • 中译:反序列化
  • 含义: 字节 恢复为 Java 对象 的过程。
  • 作用:
    • 接收方:需要从字节序列中恢复出Java对象

2.1 如何实现反序列化
  • 1.获取文件
  • 2.将文件进行反序化 (输入流--读)
    • FileInputStream fis = new FileInputStream(file);
    • ObjectInputStream ois = new ObjectInputStream(fis);
  • 3.读取文件对象(读取实体)
    • SerializableByEntiy serializableByEntiy = (SerializableByEntiy) ois.readObject();

import lombok.NoArgsConstructor;

import java.io.*;

/**
* Created by Calvin On 2017/12/19.
* 反序列化
* 1.创建一个对象输入流,它可以包装一个其它类型输入流
* 2.通过对象输出流readObject()方法读取对象
*/
@Data
@NoArgsConstructor
public class Deserialize implements Serializable{

/**
* 反序列化过程
* @param args
*/
public static void main(String[] args) {
try {
// 1.获取文件
File file = new File("D:\\Eclipse_WorkSpace\\JAVA_SE\\SerializableDemon.txt");
// 2.将文件放入文件输入流
FileInputStream fis = new FileInputStream(file);
// 3.将文件流转化为 对象输入流
ObjectInputStream ois = new ObjectInputStream(fis);
// 4.读取文件对象(读取实体)
SerializableByEntiy serializableByEntiy = (SerializableByEntiy) ois.readObject();
// 5.打印
System.out.println("Name: " + serializableByEntiy.getName());
System.out.println("property: " + serializableByEntiy.getProprety());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

}