java的序列化与反序列化

一、定义

Java序列化和反序列化:
序列化 就是指把Java对象转换为字节序列的过程。(例如将一个类转化为json类型)
反序列化就是指把字节序列恢复为Java对象的过程。

在Java实际运用中,,许多方面应用序列化反序列化------持久化、通信、缓存、消息队列等。(这个过程是在 JVM 中独立完成的,可以依赖于 Java 的可移植性)

序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。

反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。

在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化。

二、序列化时需要用到:

1.Serializable接口

当一个类实现了这个接口时,代表这个类可以被JVM序列化和反序列化。

序列化是将对象状态转换为可以传输或存储的格式的过程,反序列化则是将格式还原为对象的过程。

实现Serializable接口的类必须谨慎管理类结构的变更,以确保序列化和反序列化的兼容性。

2.serialVersionUID属性

是类的一个静态成员变量,标识类的版本。

当类的结构发生变更时,如果没有设置serialVersionUID,JVM会根据类的结构自动生成一个默认值。

为了确保序列化的兼容性,通常我们会手动设置一个固定的serialVersionUID值。这样即使类结构变更,只要serialVersionUID不变,序列化和反序列化就可以保持兼容。

3.transient关键字

这个关键字可以修饰类的成员变量。

被transient修饰的变量在序列化时会被忽略,不参与序列化和反序列化过程。(常用在不需要序列化一些敏感信息或者临时数据)

三、Java代码示例序列化

java 复制代码
package com.hollis;
import java.io.Serializable;
import java.util.Date;
 
 
public class User implements Serializable{
    private String name;
    private int age;
    private Date birthday;
    private transient String gender;
    private static final long serialVersionUID = -6849794470754667710L;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public Date getBirthday() {
        return birthday;
    }
 
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
 
    public String getGender() {
        return gender;
    }
 
    public void setGender(String gender) {
        this.gender = gender;
    }
 
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + ''' +
                ", age=" + age +
                ", gender=" + gender +
                ", birthday=" + birthday +
                '}';
    }
}
java 复制代码
package com.hollis;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import java.io.*;
import java.util.Date;
 
 
public class SerializableDemo {
 
    public static void main(String[] args) {
        //初始化
        User user = new User();
        user.setName("zhangsan");
        user.setGender("male");
        user.setAge(20);
        user.setBirthday(new Date());
        System.out.println(user);
 
        //写到File
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("tempFile"));
            oos.writeObject(user);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(oos);
        }
 
        //从File读
        File file = new File("tempFile");
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream(file));
            User newUser = (User) ois.readObject();
            System.out.println(newUser);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(ois);
            try {
                FileUtils.forceDelete(file);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
 
    }
}

总结

1、在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化(要想将父类对象也序列化,就需要让父类也实现Serializable 接口,)

2、通过IO类ObjectOutputStream和ObjectInputStream,中的writeObject()、readObject()方法 ,对对象进行序列化及反序列化

3、虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID)

4、Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。

5、序列化并不保存静态变量。

6、常用于文件和数据库的持久化、通信、缓存、消息队列等

相关推荐
Despacito0o1 分钟前
C语言基础:变量与进制详解
java·c语言·开发语言
nightunderblackcat22 分钟前
进阶向:人物关系三元组,解锁人物关系网络的钥匙
开发语言·python·开源·php
MrSYJ39 分钟前
UserDetailService是在什么环节生效的,为什么自定义之后就能被识别
java·spring boot·后端
科大饭桶2 小时前
C++入门自学Day11-- String, Vector, List 复习
c语言·开发语言·数据结构·c++·容器
范范之交2 小时前
JavaScript基础语法two
开发语言·前端·javascript
Felven2 小时前
C. Game of Mathletes
c语言·开发语言
long3162 小时前
构建者设计模式 Builder
java·后端·学习·设计模式
吐个泡泡v2 小时前
Maven 核心命令详解:compile、exec:java、package 与 IDE Reload 机制深度解析
java·ide·maven·mvn compile
点云SLAM2 小时前
C++中内存池(Memory Pool)详解和完整示例
开发语言·c++·内存管理·内存池·new/delete·malloc/free
天上掉下来个程小白2 小时前
微服务-01.导入黑马商城
java·微服务·架构