首页 > 编程语言 >JavaSE——IO流5:高级流(序列化与反序列化流/对象操作流)

JavaSE——IO流5:高级流(序列化与反序列化流/对象操作流)

时间:2024-10-23 10:49:17浏览次数:10  
标签:name 对象 age IO new JavaSE 序列化 String

目录

一、序列化流/对象操作输出流——ObjectOutputStream

二、反序列化流/对象操作输入流——ObjecInputStream

三、序列化流和反序列化流使用细节

1.Serializable接口

2.序列化后的文件不可修改

3.serialVersionUID

4.transient修饰的不能被序列化

四、用对象流读写多个对象


序列化流            ObjectOutputStream        OutputStream

反序列化流        ObjecInputStream             InputStream

一、序列化流/对象操作输出流——ObjectOutputStream

序列化流可以把Java对象写到本地文件中 

注意:使用对象输出流将对象保存到文件时会出现NotSerializableException异常。所以输出的对象必须实现Serializable接口。 

代码示例:

public class ObjectStreamDemo1 {
    public static void main(String[] args) throws IOException {
        // 需求:利用序列化流/对象操作输出流,把一个对象写到本地文件中
        // 1.创建对象
        Student student = new Student("张三", 25);
        // 2.创建序列化流的对象/对象操作输出流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("chapter18\\src\\com\\testdemo\\myobjectstream\\a.txt"));
        // 3.写出数据
        oos.writeObject(student);
        // 4.释放资源
        oos.close();
    }
}

/**
 * Serializable接口里面是没有抽象方法,标记型接口
 * 一旦实现了这个接口,就表示当前的Student类可以被序列化
 * 理解:一个物品的合格证
 */
class Student implements Serializable {
    private String name;
    private int age;

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

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

运行结果:

二、反序列化流/对象操作输入流——ObjecInputStream

可以把序列化到本地文件中的对象,读取到程序中来

代码实现: 

public class ObjectStreamDemo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 1.创建反序列化流的对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("chapter18\\src\\com\\testdemo\\myobjectstream\\a.txt"));
        
        // 2.读取数据
        Object readObject = ois.readObject();
        // Student readObject = (Student)ois.readObject();  // 可以强转
        
        // 3.打印对象
        System.out.println(readObject);
        // Student{name='张三', age=25}
        
        // 4.释放资源
        ois.close();
    }
}

三、序列化流和反序列化流使用细节

1.Serializable接口

        使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口。否则,会出现NotSerializableException异常。

2.序列化后的文件不可修改

        序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了。

修改序列化后的文件:

再次执行反序列化代码:

会抛出StreamCorruptedException异常

3.serialVersionUID

当对象被序列化到本地文件后,如果继续修改类,反序列化会失败,原因是版本号不一样,需要将IDEA设置serialVersionUID

Student类就会生成一个版本号,修改Student类也能反序列化成功 

 

如果不定义serialVersionUID,会抛出InvalidClassException异常

注意:版本号要最后定义,即在类定义完成后再定义版本号,因为版本号是根据当前类的成员生成的。

4.transient修饰的不能被序列化

        如果一个对象中的某个成员变量的值不向北序列化,就需要给该成员变量添加transient关键字修饰,该关键字标记的成员变量不参与序列化过程。

四、用对象流读写多个对象

public class ObjectStreamDemo3 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        System.out.println("----------------序列化---------------");
        
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("chapter18\\src\\com\\testdemo\\myobjectstream\\b.txt"));
        ArrayList<Teacher> list = new ArrayList<>();
        list.add(new Teacher("zhangsan", 23, "南京"));
        list.add(new Teacher("lisi", 24, "北京"));
        list.add(new Teacher("wangwu", 26, "重庆"));
        oos.writeObject(list);
        oos.close();

        System.out.println("----------------反序列化---------------");
        
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("chapter18\\src\\com\\testdemo\\myobjectstream\\b.txt"));
        ArrayList<Teacher> teachers = (ArrayList<Teacher>) ois.readObject();
        for (Teacher teacher : teachers) {
            System.out.println(teacher);
        }
        /**
         * Teacher{name='zhangsan', age=23, address='南京'}
         * Teacher{name='lisi', age=24, address='北京'}
         * Teacher{name='wangwu', age=26, address='重庆'}
         */
        ois.close();
    }
}

class Teacher implements Serializable {
    
    private static final long serialVersionUID = 6030696901056953191L;
    
    private String name;
    private int age;
    private String address;

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

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

标签:name,对象,age,IO,new,JavaSE,序列化,String
From: https://blog.csdn.net/Helen_1997_1997/article/details/133683961

相关文章

  • 迁移线程migration
    每个处理器有一个迁移线程,线程名称是“migration/<cpu_id>”,属于停机调度类,可以抢占所有其他进程,其他进程不可以抢占它。迁移线程有两个作用。(1)调度器发出迁移请求,迁移线程处理迁移请求,把进程迁移到目标处理器。(2)执行主动负载均衡。如图所示,每个处理器有一个停机工作管理器,成员......
  • Windows下给Visual Studio添加OpenSSL
    一、安装OpenSSL1.下载OpenSSLWin32/Win64OpenSSLInstallerforWindows-ShiningLightProductions可以下载已经编译好的包含lib和include文件的安装包有Win32和Win64可选,这里的位数指的是你使用OpenSSL开发出来的软件的位数版本,而不是你计算机的位数。注意,不要下载......
  • NullPointerException—配置属性为null
    1.问题描述空指针异常,获取属性配置类AliOssProperties中的endpoint属性时,为空。配置文件中正确配置了相关的属性,并且AliOssProperties上加了@ConfigurationProperties,启动类上通过@EnableConfigurationProperties(AliOssProperties.class)启用了配置属性支持。Errorstarti......
  • Anticipation prediction
    PaperTitleAuthorsSourceYearCitationsDOIAbstractSummaryAnticipatingObjectStateChangesVictoriaManousaki+5arXiv.org20240DOIThispaperproposesamethodforanticipatingobjectstatechangesinimagesandvideosbyintegratingvisuala......
  • Gradio(二):利用纯python代码创建Web应用最简单的包
    接上文“Gradio:利用纯python代码创建Web应用最简单的包”本文进一步介绍Gradio包的使用。1、多个输入与多个输出当需要多个输入和多个输出时importgradioasgrdefgreet(name,is_morning,temperature):salutation="Goodmorning"ifis_morningelse"Goodeve......
  • 基于FFT + CNN - BiGRU-Attention 时域、频域特征注意力融合的电能质量扰动识别模型
    往期精彩内容:Python-电能质量扰动信号数据介绍与分类-CSDN博客Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客Python电能质量扰动信号分类(三)基于Transformer的一维信号分类模型-......
  • 多特征变量序列预测(二)——CNN-LSTM-Attention风速预测模型
    往期精彩内容:时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较全是干货|数据集、学习资料、建模资源分享!EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现(一)EMD-CSDN博客EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现(二)EEMDEMD、EE......
  • 轴承故障诊断 (12)基于交叉注意力特征融合的VMD+CNN-BiLSTM-CrossAttention故障识别模
    往期精彩内容:Python-凯斯西储大学(CWRU)轴承数据解读与分类处理Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客三十多个开源数据集|故障诊断再也不用担心数据集了!P......
  • Error--An incompatible version [1.2.33] of the Apache Tomcat Native library is i
     这个错误表明,当前系统上安装的ApacheTomcatNativelibrary版本不兼容,具体来说:系统安装的TomcatNativelibrary版本是1.2.33,但Tomcat需要至少1.2.34版本。ApacheTomcatNativeLibrary是Tomcat用来加速网络I/O的一个库,特别是在使用APR(ApachePortableRunt......
  • IO软件层次结构
    用户层软件实现与用户交互的接口,用户可直接调用在用户层提供的、与IO操作有关的库函数,对设备进行操作.通常大部分的IO软件都在操作系统内核,但仍有一小部分在用户层,包括与用户程序链接在一起的库函数.用户层IO软件必须通过一组系统调用来获取操作系统服务设备独立性软件设备......