Java---序列化与反序列化(ObjectOutputStream/ObjectInputStream)

本文详细介绍了序列化和反序列化的概念及其在Java中的应用。序列化是将对象转换为二进制字节流的过程,便于传输和保存;反序列化则是将字节流还原为对象。文章通过实例演示了如何使用ObjectOutputStream和ObjectInputStream类进行序列化和反序列化操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:什么是序列化与反序列化

序列化:

  • 将内存中的对象变为二进制字节流的形式进行传输或保存在文本中;
  • 并不是所有对象都要被序列化, 一般对象要进行传输需要被序列化;
  • 对象若要被序列化输出,该类需要实现Serializable接口。即只有实现Serializable接口的类才有序列化能力。

反序列化:把文本中二进制字节流反序列化为一个对象。

import java.io.Serializable;
public interface Serializable {
}

Serializable 接口里什么功能也没有,只是一个标识接口,标识着实现Serializable 的类具有序列化功能。

实现序列化与 反序列化

实现序列化与反序列化,需要使用IO包提供的两个类:

  • ObjectOutputStream----对象字节输出流,不存在对象字符输出流
  • ObjectInputStream—对象字节输入流,不存在对象字符输入流

对象的序列化输出----ObjectOutputStream

public class ObjectOutputStream    extends OutputStream implements ObjectOutput, ObjectStreamConstants

构造方法:

//out指通过什么方式进行传输,可以是文件等
public ObjectOutputStream(OutputStream out) throws IOException

对象写入方法:

//需要传入要写入的对象
public final void writeObject(Object obj) throws IOException

例:对象序列化

package CODE.JavaIo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


//实现Serializable接口 ,具有序列化功能
class Student implements Serializable
{
    private String name;  //姓名
    private int sno;   //学号

    public Student(String name, int sno) {
        this.name = name;
        this.sno = sno;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sno='" + sno + '\'' +
                '}';
    }
}
public class Xulie {
    public static void main(String[] args) throws Exception {
        //1.取得终端对象
        File file=new File("C:"+File.separator+"Users"+File.separator+
                "lenovo"+File.separator+"Desktop"+
                File.separator+"Test.txt");
        //2.取得对象的输出流,对象序列化
        Student s=new Student("pick",24);
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
        //3.对象的写入
        oos.writeObject(s);
        //4.关闭流
        oos.close();
    }
}

在这里插入图片描述
对象的反序列化输入----ObjectInputStream

public class ObjectInputStream    extends InputStream implements ObjectInput, ObjectStreamConstants

构造方法:

//传输输入流对象
public ObjectInputStream(InputStream in) throws IOException

对象的反序列化输入:

//由于是从文本中读取,需要将文本中二进制字节流反序列化为一个对象返回
  public final Object readObject()       throws IOException, ClassNotFoundException

例:对象的反序列化

package CODE.JavaIo;

import java.io.*;

public class Xulie {
    public static void main(String[] args) throws Exception {
        //1.取得终端对象
        File file=new File("C:"+File.separator+"Users"+File.separator+
                "lenovo"+File.separator+"Desktop"+
                File.separator+"Test.txt");
        //2.对象的输入流,对象反序列化
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));

        //3.对象反序列化输入
        Object obj=ois.readObject(); //Student向上转型
        System.out.println(obj); //Student{name='pick', sno='24'}
        //4.关闭流
		ois.close();
    }
}

transient关键字
Serializable默认将对象中所有属性以及值进行序列化以及反序列化,如果某些属性(密码)不需要被序列化输出,可以在属性前加transient关键字。

class Student implements Serializable
{
    private String name;  //姓名
    private transient int sno;   //学号将不会被序列化保存
 }

在这里插入图片描述
反序列化对象:

System.out.println(obj); //Student{name='pick', sno='0'}

此时反序列化后的对象的sno就为默认值0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值