教你快速实现类对象的序列化/反序列化 | 带你学《Java语言高级特性》之七十

简介: 上一节中我们通过在类中实现Serializable声明该类能够序列化,本节将带领读者借助ObjectOutputStream类和ObjectInputStream类实现对象的序列化和反序列化。

上一篇:使用Serializable实现类对象序列化能力 | 带你学《Java语言高级特性》之六十九

上一节中我们通过在类中实现Serializable声明该类能够序列化,本节将带领读者借助ObjectOutputStream类和ObjectInputStream类实现对象的序列化和反序列化。

【本节目标】
通过阅读本节内容,你将了解到ObjectOutputStream类和ObjectInputStream类的定义、相关方法等内容,并结合实例实现对类对象的序列化输出和反序列化读取的操作,同时了解其使用方面的部分限制。

序列化与反序列化处理

有了序列化的支持类后,如果想要实现序列化和反序列化操作则可以利用以下两个类完成。
序列化:ObjectOutputStream:

类定义:public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants

构造方法:
    public ObjectOutputStream(OutputStream out) throws IOException
操作方法:
    public final void writeObject(Object obj) throws IOException

反序列化:ObjectInputStream:

类定义:public class ObjectInputStream extends InputStream implements ObjectInput,ObjectStreamConstants

构造方法:
    public ObjectInputStream(InputStream in) throws IOException
操作方法:
    public final Object readObject() throws IOException, ClassNotFoundException

范例:实现序列化与反序列化

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
@SuppressWarnings("serial")
class Person implements Serializable {//Person类可以被序列化
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "姓名:" + this.name + "、年龄:" + this.age;
    }
}
public class JavaAPIDemo {
    private static final File SAVE_FILE=new File("D:" + File.separator + "mldn.person");
    public static void main(String[] args) throws Exception {
        //saveObject(new Person("小喷嚏",78));
        System.out.println(loadObject());
    }
    public static void saveObject(Object obj)throws Exception{
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
        oos.writeObject(obj);  //序列化
        oos.close();
    }
    public static Object loadObject()throws Exception{
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream(SAVE_FILE));
        Object obj= ois.readObject();   //反序列化
        ois.close();
        return obj;
    }
}

在Java中的对象序列化与反序列化必须使用内部提供的对象操作流,因为这里面牵扯到了二进制数据的格式,所以不能自定义处理,另外如果要想实现一组对象的序列化,则可以使用对象数组完成。

在很多的实际项目开发过程之中,开发者很少能见到ObjectOutputStream、ObjectInputStream类的直接操作,因为会有一些容器帮助开发者自动实现。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:transient:将属性脱离序列化 | 带你学《Java语言高级特性》之七十一
更多Java面向对象编程文章查看此处

相关文章
|
8月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
1007 157
|
8月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
351 4
|
8月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
374 5
|
8月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
406 1
|
8月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
508 1
|
8月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
325 0
|
8月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
382 1
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
12月前
|
JSON Java 数据库连接
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。