Java序列化与反序列化

本文介绍了Java序列化与反序列化的概念,包括网络传输、文件存储等应用场景。文章详细讨论了实现序列化的方式,如继承Serializable接口和Externalizable接口,并解释了serialVersionUID的作用以及静态变量不会被序列化的情况。此外,还展示了如何使用序列化实现深拷贝,并对比了几种常见的序列化协议。最后,强调了序列化过程中的安全性问题和其它序列化协议的选项。
摘要由CSDN通过智能技术生成

序列化和反序列化的概念

当我们在Java中创建对象的时候,对象会一直存在,直到程序终止时。但有时候可能存在一种”持久化”场景:我们需要让对象能够在程序不运行的情况下,仍能存在并保存其信息。当程序再次运行时 还可以通过该对象的保存下来的信息 来重建该对象。序列化和反序列化 就应运而生了, 序列化机制可以使对象可以脱离程序的运行而独立存在。

  • 序列化 : 将对象转换成二进制字节流的过程
  • 反序列化 :从二进制字节流中恢复对象的过程

应用场景?

  1. 对象在进行 网络传输 的时候,需要先被序列化,接收到序列化的对象之后需要再进行反序列化;比如远程方法调用 RPC
  2. 将对象存储到 文件 中的时候需要进行序列化,将对象从文件中读取出来需要进行反序列化。
  3. 将对象存储到 内存 中,需要进行序列化,将对象从内存中读取出来需要进行反序列化。
  4. 将对象存储到 数据库 (如 Redis)时,需要用到序列化,将对象从缓存数据库中读取出来需要反序列化。

 

序列化实现的方式

如果使用Jdk自带的序列化方式实现对象序列化的话,那么这个类应该实现Serializable接口或者Externalizable接口

继承Serializable接口,普通序列化

首先我们定义一个对象类User

public class User implements Serializable {
    //序列化ID
    private static final long serialVersionUID = 1L;
    private int age;
    private String name;

    public User(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

然后我们编写一下测试类:

public class serTest {
    public static void main(String[] args) throws Exception, IOException {
        SerializeUser();
        DeSerializeUser();
    }

    /**
     * 序列化方法
     * @throws IOException
     */
    private static void SerializeUser() throws  IOException {
        User user = new User(11, "小张");

        //序列化对象到指定的文件中
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\jun\\Desktop\\example"));
        oos.writeObject(user);
        oos.close();
        System.out.println("序列化对象成功");
    }

    /**
     * 反序列化方法
     * @throws IOException
     * @throws ClassNotFoundException
     */
    private static void DeSerializeUser() throws  IOEx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值