JAVA中的对象流ObjectInputStream

11 篇文章 0 订阅

ObjectInputStream是Java中用于序列化对象的一种输入流,它允许我们将对象的状态信息从输入流中读取出来,以便在后续程序中使用。本文将详细介绍ObjectInputStream的原理、使用方法以及相关代码例子。

一、ObjectInputStream简介

  1. 概述 ObjectInputStream继承了InputStream类,主要用于读取序列化后的对象。序列化是指将对象的状态信息转换为可存储或传输的格式的过程。反序列化则是将序列化后的数据恢复为对象的过程。

  2. 主要方法 以下是ObjectInputStream类的一些主要方法:

  • public ObjectInputStream(InputStream in):创建一个ObjectInputStream对象,用于读取指定InputStream中的对象。
  • public final Object readObject():从输入流中读取一个对象。
  • public int read():读取一个字节的数据。
  • public int read(byte[] b, int off, int len):读取一定长度的字节数据到字节数组中。
  • public void close():关闭输入流。

二、ObjectInputStream使用步骤

  • 创建ObjectInputStream对象;
  • 使用readObject()方法读取序列化后的对象;
  • 处理读取到的对象;
  • 关闭输入流。

三、代码例子 以下是一个使用ObjectInputStream进行对象反序列化的示例:

  1. 定义一个可序列化的类 首先,我们需要定义一个可序列化的类。可序列化的类需要实现Serializable接口。

import java.io.Serializable;
public class Student implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    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;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  1. 序列化对象 将Student对象序列化到文件中。

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class SerializeDemo {
    public static void main(String[] args) {
        try {
            Student student = new Student("张三", 20);
            FileOutputStream fos = new FileOutputStream("student.obj");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(student);
            oos.close();
            fos.close();
            System.out.println("对象序列化成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. 反序列化对象 从文件中读取Student对象。

import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class DeserializeDemo {
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("student.obj");
            ObjectInputStream ois = new ObjectInputStream(fis);
            Student student = (Student) ois.readObject();
            ois.close();
            fis.close();
            System.out.println("对象反序列化成功!");
            System.out.println(student);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

四、注意事项

  1. 可序列化类的 serialVersionUID 在可序列化类中,建议显式声明一个名为serialVersionUID的静态常量,用于标识该类的版本。这样可以确保在反序列化过程中,类的版本与序列化时的版本一致。

  2. transient关键字 如果一个类的字段不需要被序列化,可以使用transient关键字进行修饰。这样,在序列化对象时,该字段不会被包含在内。

  3. 父类序列化 如果一个类继承自另一个类,那么父类也需要实现Serializable接口,才能保证子类对象能够被序列化。

  4. 异常处理 在使用ObjectInputStream进行反序列化时,可能会抛出异常,如ClassNotFoundException、IOException等。需要对这些异常进行捕获和处理。 总结: ObjectInputStream是Java中用于反序列化对象的重要工具。通过本文的介绍,相信您已经掌握了ObjectInputStream的使用方法和相关注意事项。在实际开发中,合理使用对象流可以方便地在程序间传递和存储对象数据。需要注意的是,序列化机制并非适用于所有场景,例如敏感数据等,因此在设计类时,要充分考虑序列化的需求和潜在风险。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值