Java序列化
序列化:讲对象写入到IO流
反序列化:从IO流中恢复对象
意义:序列化机制允许将实现序列化的Java对象转换为字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,已达到恢复成原来的对象。序列化机制使得对象可以脱离程序运行而独立存在。
使用场景:所有网络上的传输的对象都必须是可序列化的,比如RMI(远程方法调用),传入的参数和返回的对象都是可序列化的,否则会出错。所有需要保存到磁盘的Java对象都必须是可序列化的。通常建议:程序创建的每个JavaBean类都实现Serializeable接口。
序列化实现的方式:
1,Serializeable
Serializeable接口是一个标记接口,不用实现任何方法,一旦实现了此接口,该类的对象就是可序列化的
import java.io.Serializable; public class Dome1 implements Serializable { private String name; private int age; //不提供无参构造器 public Dome1(String name, int age){ this.name = name; this.age = age; } @Override public String toString(){ return "Person{" + "name =" + name + '\'' + ", age=" + age + '}'; } } public class WriteObject{ public static void main(String[] args) { try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt"))){ //将对象序列化到文件 Person person = new Person("L", 21); oss.writeObject(person); }catch(Exception e){ e.printStackTrace(); } } }
反序列化步骤:
1,创建一个ObjectInputStream输入流;
2,调用ObjectInputStream对象的readObject()得到序列化的对象
还可以用writeObject和readObject自定义序列化策略
序列化ID:虚拟机会否允许反序列化,不仅取决于类路径和功能代码会否一致,更重要的是两个类的序列化ID会否一致
Java序列化算法:
- 所有保存到磁盘的对象都有一个序列化编码号
- 当程序试图序列化一个对象的时候,会先检查此对象是否已经序列化,只有此对象从未被序列化过,才会将此对象序列化为字节序列化输出
- 如果此对象已经被序列化过,则直接输出编号即可
Transient关键字阻止该变量被序列化到文件中
- 在变量声明前加上Transient关键字,可以阻止该变量被序列化到文件中,在反序列化后,transient变量的值被设置为初始值,如int型是0,对象型的是null
- 服务器端给客户端发送序列化对象数据,对象中有一些数据是敏感的,比如密码字符串等,希望在对该密码字段在序列化时,进行加密,而客户端如果有解密的秘钥,只要在客户端进行反序列化时,才可以对密码进行读取,这样可以一定程度保证序列化对象数据的安全性。

浙公网安备 33010602011771号