java对象的序列化和反序列化

下面是Java对象的序列化和反序列化的完整攻略:

概述

Java对象的序列化和反序列化是一种将对象转化成字节序列以便存储和传输的机制,同时也是将字节序列转化为对象的一种机制。

Java序列化通常用于将对象存储到文件中或者通过网络传输数据,反序列化则是将序列化后的字节流转换成原来的对象。

如何序列化和反序列化对象

Java对象的序列化和反序列化可以通过Java的标准库实现,具体使用方法如下:

序列化

将Java对象进行序列化,需要执行下面两个步骤:

  1. 实现Serializable接口

Java对象必须实现Serializable接口才可以进行序列化,Serializable是一个空的接口,只是起到可以序列化的标记作用,该接口中没有任何方法或属性。若未实现Serializable接口,会在序列化时抛出java.io.NotSerializableException异常。

  1. 调用ObjectOutputStream类实现序列化

使用ObjectOutputStream类可以方便的将Java对象进行序列化,使用该类进行序列化的基本步骤如下:

OutputStream outputStream = new FileOutputStream("file.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(object);
objectOutputStream.flush();
objectOutputStream.close();

上述代码中,writeObject方法将对象进行序列化,flush方法将缓存数据写入磁盘,close方法关闭输出流。序列化后的对象将保存在file.txt文件中。

反序列化

将Java对象进行反序列化,需要执行下面两个步骤:

  1. 调用ObjectInputStream类实现反序列化

使用ObjectInputStream类方便的可以将序列化后的数据转换成Java对象,使用该类进行反序列化的基本步骤如下:

InputStream inputStream = new FileInputStream("file.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Object object = objectInputStream.readObject();
objectInputStream.close();

上述代码中,readObject方法将从文件中读取序列化后的数据,并将其转换成Java对象返回,close方法关闭输入流。反序列化的对象为object

  1. 反序列化后需要进行强制类型转换

因为反序列化后得到的对象是Object类型,所以需要将其强制转换成原先的数据类型,示例代码如下:

Student student = (Student) object;

示例

下面我们来看两个示例:

示例一

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

// 定义Student类
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 void display() {
        System.out.println("name:" + name + ", age:" + age);
    }
}

public class SerializeDemo {
    public static void main(String[] args) throws Exception {
        Student student = new Student("Tom", 18);
        // 序列化
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("student.txt"));
        objectOutputStream.writeObject(student);
        objectOutputStream.flush();
        objectOutputStream.close();

        // 反序列化
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("student.txt"));
        Student s = (Student) objectInputStream.readObject();
        s.display();
        objectInputStream.close();
    }
}

代码解析:

该例子定义了一个Student类,实现了Serializable接口,通过定义display方法,来展示反序列化后的数据。

该例子通过ObjectOutputStream类实现了序列化,将Student对象序列化并保存到文件中,通过ObjectInputStream类实现了反序列化,从文件中读取序列化的数据并将其转换为Student对象。

示例二

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

// 定义Student类
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 void display() {
        System.out.println("name:" + name + ", age:" + age);
    }
}

public class SerializeDemo {
    public static void main(String[] args) throws Exception {
        Student student = new Student("Tom", 18);
        // 序列化
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(student);
        objectOutputStream.flush();
        objectOutputStream.close();

        // 反序列化
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        Student s = (Student) objectInputStream.readObject();
        s.display();
        objectInputStream.close();
    }
}

代码解析:

该例子同样定义了一个Student类,实现了Serializable接口,通过定义display方法,来展示反序列化后的数据。

该例子通过ByteArrayOutputStream类实现了序列化,将Student对象序列化并保存到内存中,通过ByteArrayInputStream类实现了反序列化,从内存中读取序列化的数据并将其转换为Student对象。

至此,Java对象的序列化和反序列化的攻略已经介绍完毕。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java对象的序列化和反序列化 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • java中File类的使用方法

    关于Java中的File类,我们可以从以下几个方面入手进行讲解。 什么是File类 Java中提供了一个File类,它代表着文件或目录的抽象表示。File类并不代表着文件或目录的内容,它只是文件或目录在操作系统中的一个抽象,可以用于操作文件或目录的元数据(metadata),如文件的大小,最后一次修改时间等。在Java中,可以对File对象进行读写操作,以便…

    Java 2023年5月20日
    00
  • SpringCloud2020版本配置与环境搭建教程详解

    SpringCloud 2020版本配置与环境搭建教程详解 简介 Spring Cloud 作为微服务框架之一,在微服务架构中扮演着重要角色。本文将介绍Spring Cloud 2020版本的环境搭建教程,帮助你搭建基于Spring Cloud微服务架构的项目。 步骤 1. 准备环境 首先需要准备以下环境: JDK 1.8+ Maven IDE(推荐使用In…

    Java 2023年5月20日
    00
  • 详解JavaScript中数组的reduce方法

    下面我将详细讲解JavaScript中数组的reduce方法。 1. reduce方法是什么 reduce()是JavaScript中数组的一个方法,可以用来逐个处理数组中的元素,并返回一个累加结果,其语法如下: array.reduce(function(previousValue, currentValue, index, array){ // 处理当前…

    Java 2023年5月26日
    00
  • Java8排序stream.sorted()的使用

    当我们需要对一个List或数组等集合进行排序时,我们可以使用Java8中的Stream.sorted()方法进行排序。下面就详细讲解一下Java8排序Stream.sorted()的使用攻略。 一、Stream的sorted()方法 Stream.sorted()方法是一个中间操作,它返回一个排序好的流,可以对元素进行自然排序或指定Ordering排序。 下…

    Java 2023年5月26日
    00
  • ASP.NET 页面刷新的实现方法(包括html,js)

    ASP.NET 页面刷新的实现方法可以通过 HTML 页面自身的 meta 标记或者使用 JavaScript 来完成。 通过 HTML 页面的 meta 标记实现页面刷新 HTML 页面可以通过设置 meta 标记来控制页面的刷新,具体方法为: <!–每5秒自动刷新页面–> <meta http-equiv="refresh…

    Java 2023年6月15日
    00
  • java中实现map与对象相互转换的几种实现

    当我们需要将Java中的Map和对象进行相互转换时,可以使用以下几种实现方法: 方法一:手动转换 手动将Map中的键值对映射到Java Bean中的字段,并反之。这种方法的实现相对比较简单,但是存在缺陷是需要手动对属性进行处理,比较繁琐,不够自动化 public class User { private Long id; private String nam…

    Java 2023年5月26日
    00
  • Java 对象深拷贝工具类的实现

    概述: Java 对象深拷贝是指将一个对象完全复制另一个对象,即所有属性和属性值都被复制,并且两个对象之间没有相互影响。在 Java 开发中经常会使用对象深拷贝,比如在进行对象传参、克隆等场合都需要进行对象深拷贝。本文将详细讲解 Java 对象深拷贝工具类的实现。 实现: Java 中提供了两种方式实现深拷贝:Serializable 和 Cloneable…

    Java 2023年5月26日
    00
  • Struts1教程之ActionMapping_动力节点Java学院整理

    Struts1教程之ActionMapping_动力节点Java学院整理 1. 了解ActionMapping ActionMapping 是 Struts1 框架中的一个重要组件,它主要负责将请求的 URL 映射到相应的 Action 类,以便执行对应的业务逻辑。也就是说,我们可以通过 ActionMapping 来实现 URL 到 Action 类及其方…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部