Java 序列化

前言

对于Java的序列化,一直只知道只需要实现Serializbale这个接口就可以了。停留在了表面,在项目中使用Dubbo时,发现对象需要实现Serializbale,涉及到了序列化问题。就补了一下Java序列化的底层实现。

1.What

  • Java序列化 是指把Java对象保存为二进制字节码的过程;
  • Java反序列化 是指把二进制字节码重新转换成Java对象的过程。

那么为什么需要序列化呢?

  • 第一种情况是:一般情况下Java对象的声明周期都比Java虚拟机的要短,实际应用中我们希望在JVM停止运行之后能够持久化指定的对象,这时候就需要把对象进行序列化之后保存。

  • 第二种情况是:需要把Java对象通过网络进行传输的时候。因为数据只能够以二进制的形式在网络中进行传输,因此当把对象通过网络发送出去之前需要先序列化成二进制数据,在接收端读到二进制数据之后反序列化成Java对象。

2.How

演示demo

使用一个demo演示一下:

import java.io.*;

public class Student implements Serializable {
   

    private static final long serialVersionUID = -7067671538866851177L;

    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }

    public static void main(String[] args) throws Exception {
        // 1. 序列化:对象->文件
        FileOutputStream fileOutputStream = new FileOutputStream("student.out");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

        Student writeStudent = new Student();
        writeStudent.setId(1);
        writeStudent.setName("xiao");
        writeStudent.setAge(25);

        objectOutputStream.writeObject(writeStudent);
        objectOutputStream.flush();
        objectOutputStream.close();
        // 2.反序列化:文件->对象
        FileInputStream fileInputStream = new FileInputStream("student.out");
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        Student readStudent = (Student) objectInputStream.readObject();

        System.out.println("sutudent id :" + readStudent.getId());
        System.out.println("sutudent name :" + readStudent.getName());
        System.out.println("sutudent age :" + readStudent.getAge());
    }
}

输出结果:

sutudent id :1
sutudent name :xiao
sutudent age :25

查看二进制文件

使用二进制编辑器(如: Synalyze It Pro Mac)查看 student.out 文件

这里写图片描述

3.Why

1.调用ObjectOutputStream.writeObject()和ObjectInputStream.readObject()之后究竟做了什么?

1. Serializable 接口

查看 Serializable 接口,可以发现这个接口没有任何方法或字段。

/*
 * @author  unascribed
 * @see java.io.ObjectOutputStream
 * @see java.io.ObjectInputStream
 * @see java.io.ObjectOutput
 * @see java.io.ObjectInput
 * @see java.io.Externalizable
 * @since   JDK1.1
 */
public interface Serializable {
   
}

查看注释可以看到:

The serialization interface has no methods or field
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值