Java文件操作之序列化与对象处理流详解

 更新时间:2022年09月15日 10:00:04   作者:兴趣使然黄小黄  
这篇文章主要为大家详细介绍了Java文件操作中的序列化与对象处理流,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

1.序列化与反序列化

序列化就是在保存数据时,保存数据的值和数据类型;

反序列化就是在恢复数据时,恢复数据的值和数据类型;

需要让某个对象支持序列化机制,则必须让其类是可序列化的;

为了让某个类是可序列化的,该类必须实现 Serilizable与 Externalizable 两个接口之一。

为什么需要对象处理流?

答:假设我们存储了 int num = 20这个数据到文件中,而这个20是一个数字,我们需要从文件中将数据恢复。

可是,文件中仅仅存储了 20 这一个数字,我们没有办法判断,存储它的时候是将它存储为了 int 类型还是 String 类型。

而对象处理流,就是帮助我们解决类似问题的,即:能够将 基本数据类型 或者 对象 进行序列化和反序列化操作!

2.对象处理流

2.1 概述

ObjectOutputStream 提供 序列化功能;

ObjectInputStream 提供 反序列化功能。

提供了对基本类型或者对象类型的序列化和反序列化方法。

类的继承关系图如下:

2.2 ObjectOutputStream案例

使用ObjectOutputStream序列化基本数据类型和一个Student对象(name,age),保存到data.dat文件中。

参考代码与结果:

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

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * 序列化基本数据类型和对象类型演示
 */
public class ObjectOutputStreamTest {
    public static void main(String[] args) {
        //创建流对象
        ObjectOutputStream objectOutputStream = null;
        try {
            objectOutputStream = new ObjectOutputStream(new FileOutputStream(
                    "D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\data.dat"));
            //序列化后,保存的文件格式,不是纯文本,而是按照它自己的格式存储的
            //序列化数据
            //int -> Integer(实现了 Serializable)
            objectOutputStream.writeInt(100);
            //boolean -> Boolean(实现了 Serializable)
            objectOutputStream.writeBoolean(true);
            //char -> Character
            objectOutputStream.writeChar('a');
            //String
            objectOutputStream.writeUTF("黄小黄");
            //保存一个Student对象
            objectOutputStream.writeObject(new Student("黄小黄", 21));

            System.out.println("数据序列化成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //释放资源
            if(objectOutputStream != null) {
                try {
                    objectOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

class Student implements Serializable{
    private String name;
    private int age;

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

说明:

序列化基本数据类型的时候,会进行自动装箱。比如存储int类型的100,则会以Integer的形式自动装箱后存储,因为Integer实现了Serializable接口。

2.3 ObjectInputStream案例

使用ObjectInputStream读取data.dat的数据,并反序列化恢复数据。

参考代码与结果:

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

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 */
public class ObjectInputStreamTest {
    public static void main(String[] args) {
        //创建流对象
        ObjectInputStream objectInputStream = null;
        try {
            objectInputStream = new ObjectInputStream(new FileInputStream(
                    "D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\data.dat"));
            //读取数据
            System.out.println(objectInputStream.readInt());
            System.out.println(objectInputStream.readBoolean());
            System.out.println(objectInputStream.readChar());
            System.out.println(objectInputStream.readUTF());
            System.out.println(objectInputStream.readObject());
            //程序结束
            System.out.println("反序列化完成!");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            //释放资源
            if (objectInputStream != null){
                try {
                    objectInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
 }

说明:

反序列化的顺序一定要与序列化的顺序一样,否则,程序会抛出异常。

2.4 对象处理流的使用细节

1.读写顺序一致,即序列化与反序列化的顺序应该一致;

2.要求实现序列化或者反序列化对象,需要实现Serializable接口;

3.序列化类中建议添加SerialVersionUID,为了提高版本兼容性;

4.序列化对象时,默认将里面所有的属性都进行序列化,但static与transient修饰的成员除外;

5.序列化对象时,要求里面的属性的类型也要实现序列化接口;

6.序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化。

到此这篇关于Java文件操作之序列化与对象处理流详解的文章就介绍到这了,更多相关Java序列化 对象处理流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mybatis使用xml进行增删改查代码解析

    mybatis使用xml进行增删改查代码解析

    这篇文章主要介绍了mybatis使用xml进行增删改查代码解析,分享了相关配置和代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Mysql存储java对象实例详解

    Mysql存储java对象实例详解

    这篇文章主要介绍了Mysql存储java对象实例详解的相关资料,需要的朋友可以参考下
    2016-11-11
  • java快速排序和选择排序实现实例解析

    java快速排序和选择排序实现实例解析

    这篇文章主要为大家介绍了java快速排序和选择排序实现实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 使用Gson将字符串转换成JsonObject和JsonArray

    使用Gson将字符串转换成JsonObject和JsonArray

    这篇文章主要介绍了使用Gson将字符串转换成JsonObject和JsonArray,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java泛型类与泛型方法的定义详解

    Java泛型类与泛型方法的定义详解

    这篇文章主要介绍了Java泛型类与泛型方法的定义,结合实例形式详细分析了java泛型类与泛型方法定义、用法及相关操作注意事项,需要的朋友可以参考下
    2019-08-08
  • Java数据结构之List的使用总结

    Java数据结构之List的使用总结

    List是Java中比较常用的集合类,指一系列存储数据的接口和类,可以解决复杂的数据存储问题,本文就来拿实际案例总结介绍一下List的使用方法,感兴趣的朋友快来看看吧
    2021-11-11
  • Java代码审计之URL重定向的问题解决

    Java代码审计之URL重定向的问题解决

    URLRedirect url重定向漏洞也称url任意跳转漏洞,网站信任了用户的输入导致恶意攻击,本文主要介绍了Java代码审计之URL重定向的问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • SpringMVC HttpMessageConverter报文信息转换器

    SpringMVC HttpMessageConverter报文信息转换器

    ​​HttpMessageConverter​​​,报文信息转换器,将请求报文转换为Java对象,或将Java对象转换为响应报文。​​​HttpMessageConverter​​​提供了两个注解和两个类型:​​@RequestBody,@ResponseBody​​​,​​RequestEntity,ResponseEntity​​
    2023-01-01
  • 如何彻底删除SVN中的文件和文件夹(附恢复方法)

    如何彻底删除SVN中的文件和文件夹(附恢复方法)

    在SVN中如果删除某个文件或文件夹也可以在历史记录中进行找回,有的时候需要彻底删除某些文件,即不希望通过历史记录进行恢复,需要在服务器上对SVN的数据进行重新整理
    2014-08-08
  • Spring mvc服务端数据校验实现流程详解

    Spring mvc服务端数据校验实现流程详解

    这篇文章主要介绍了Spring mvc服务端数据校验实现流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09

最新评论