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
  • 服务器端给客户端发送序列化对象数据,对象中有一些数据是敏感的,比如密码字符串等,希望在对该密码字段在序列化时,进行加密,而客户端如果有解密的秘钥,只要在客户端进行反序列化时,才可以对密码进行读取,这样可以一定程度保证序列化对象数据的安全性。

 

参考文章:https://juejin.im/post/5ce3cdc8e51d45777b1a3cdf

posted @ 2020-04-22 17:13  Coding-Liu  阅读(228)  评论(0)    收藏  举报