Java序列化与反序列化

什么是序列化?

在Java中,序列化是将对象转换为字节流的过程,以便将其存储在文件中、通过网络进行传输,或者在内存中进行持久化。

序列化允许我们将对象的状态保存到字节流中,并可以在需要时重新创建相同的对象,

也就是再把文件中的字节流恢复为对象。

而这个过程也叫做反序列化。

反序列化是将序列化后的字节流恢复为对象的过程。当对象被序列化后,可以通过反序列化操作将其重新还原成原始的对象,恢复对象的状态和数据。

序列化:

注意:如果一个类实现了Serializable接口,那么该类的对象才可以被序列化。Serializable接口是一个标记接口,没有定义任何方法,它只是起到一个指示作用,告诉编译器这个类是可序列化的。如果没有实现接口,将会抛出异常。

应用场景:

·  缓存:在缓存方案中,可以将对象序列化并存储在缓存中,以避免频繁地从数据库或其他数据源加载对象。通过将对象序列化为字节流,可以将其保存在高速缓存中,并在需要时进行快速检索和反序列化。

·  对象复制:通过序列化和反序列化,可以实现对象的深度复制。当需要创建一个对象的完全相同的副本时,可以将对象序列化,然后通过反序列化来创建新的对象。这在原型模式、备忘录模式等场景中非常有用。

·  跨平台数据交换:不同平台之间的数据交换通常需要进行序列化和反序列化。通过将数据序列化为字节流,可以实现跨平台的数据传输和共享。这对于不同编程语言、操作系统或硬件架构之间的数据交互非常重要。

利用ObjectOutputStream字节输出流,将内存中的内存对象,按照固定格式转化成字节序列输出

构造方法:

ObjectOutputStream(OutputStream)

创建ObjectOutputStream流对象,该对象负责将Java对象转成字节序列,并输出到out输出流所
指向的文件中。

常用方法:

void writeObject(Object obj)

将指定的对象转成字节序列并输出。

代码示例:

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class Review_OOS01 {
    public static void main(String[] args) {

        try {
//创建流对象,用于序列化Java对象
            FileOutputStream aa = new                   FileOutputStream("write1.txt");
            ObjectOutputStream bb = new ObjectOutputStream(aa);

//创建学生对象,将对象序列化转化到磁盘文件中
            Student dd = new Student("Emma",21,"China");
            bb.writeObject(dd);

        bb.close();
            System.out.println("操作成功");
        } catch (Exception c) {
            c.printStackTrace();
            System.out.println("操作出现问题");
        }


    }
}

//定义学生类
class Student1{
    private String name;
    private int age;
    private String addr;

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

    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 String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }



}



输出:操作成功

反序列化:

构造方法:

ObjectInputStream(InputStream);

objectInputStream流用于读取序列化后的文件将其转换为对象

常用方法

Object readObject();

readObject()方法用于反序列化操作,它会从输入流中读取字节流并重建成相应的对象。该方法返回一个反序列化后的对象,并且需要进行类型转换以匹配预期的对象类型。

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class Review_OIS01 {
    public static void main(String[] args) {
        try{FileInputStream bb = new FileInputStream("write1.txt");// 创建一个输入流
        ObjectInputStream aa = new ObjectInputStream(bb);

            Object o =aa.readObject(); 从输入流中读取对象

            Student dd = (Student)o;// 将对象转换为预期的类型

        aa.close();
            System.out.println("操作成功");


        }
        catch(Exception a){
            a.printStackTrace();
            System.out.println("出现错误");
        }




    }
}


你可能感兴趣的:(java,开发语言)