实例分析java对象的序列化和反序列化

Java 对象的序列化和反序列化是 Java 编程中的一项重要技术。序列化和反序列化可以将 Java 对象在网络传输或存储时转化为二进制数据流,并在需要时将其重新生成为 Java 对象。本文将详细讲解序列化和反序列化的基本概念、实现基础、序列化和反序列化的示例应用等内容,以便读者可以深刻理解和掌握这一技术。

什么是序列化与反序列化?

序列化是指将 Java 对象转化为二进制字节流的过程,可用于将 Java 对象保存到文件系统、数据库或在计算机网络上传输。反序列化是指将二进制数据流重新转换为 Java 对象的过程。序列化和反序列化的主要目的是实现 Java 对象的持久化和网络传输。

序列化和反序列化的实现基础

Java 对象的序列化和反序列化是基于 Serializable 接口实现的。要想实现序列化和反序列化,首先需要让对象所属类实现 Serializable 接口。Serializable 接口是 Java 标准库中的一个接口,只需要让实现此接口的类中定义的所有实例变量都是可序列化的即可。可序列化的变量必须是 Java 原生数据类型和某些特殊对象,如 Date,String 或自定义的可序列化对象等。如果可序列化的变量包含对其他对象的引用,则需要确保这些对象也可以序列化。这意味着同一层级的所有对象必须实现 Serializable 接口。Java 的基本数据类型都可以序列化,包括 int、long、double、char 等等。 Serializable 接口仅仅是个标记接口,不实现里面的方法。

以下是一个简单的序列化和反序列化示例:

import java.io.*;

public class SerializationDemo {
    public static void main(String[] args) throws Exception {
        String filename = "test.txt"; // 定义一个文件名字
        // 序列化操作
        FileOutputStream file = new FileOutputStream(filename); // 初始化文件流,写入的文件名为文件名指定的文件
        ObjectOutputStream out = new ObjectOutputStream(file); // 获得对象流
        out.writeObject(new Date()); // 将日期对象写入文件
        out.close(); // 关闭输出流

        // 反序列化操作
        FileInputStream file2 = new FileInputStream(filename); // 初始化文件流
        ObjectInputStream in = new ObjectInputStream(file2); // 获得对象流
        Date d = (Date) in.readObject(); // 从文件读取对象,并转型为日期对象
        System.out.println(d); // 打印日期对象
        in.close(); // 关闭输入流
    }
}

在此例子中,首先定义了一个名为 SerializationDemo 的类,在 main 方法中,首先定义一个名为 filename 的文件名,在序列化时,通过 FileOutputStream 创建一个写入指定文件的输出流,然后通过 ObjectOutputStream 创建一个对象输出流,并将该流与文件输出流进行关联,从而将日期对象存储在文件中。在反序列化时,通过 FileInputStream 创建一个输入流,然后通过 ObjectInputStream 创建一个对象输入流,并将其与文件输入流关联,最后将反序列化的对象转换为 Date 类型并将其打印在屏幕上。

序列化与反序列化示例分析

本节将通过两个简单示例演示 Java 对象的序列化和反序列化过程。

示例 1:存储和读取 ArrayList

ArrayList 是一个基本的 Java 集合类,用于存储一组元素。下面是一个实现序列化和反序列化 ArrayList 的示例。

import java.io.*;
import java.util.ArrayList;

public class SerializationDemo {
    public static void main(String[] args) throws Exception {
        String filename = "test.txt"; // 定义一个文件名字
        ArrayList<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("World");
        list.add("!");
        // 序列化操作
        FileOutputStream file = new FileOutputStream(filename); // 初始化文件流
        ObjectOutputStream out = new ObjectOutputStream(file); // 获得对象流
        out.writeObject(list); // 将列表写入文件
        out.close(); // 关闭输出流

        // 反序列化操作
        FileInputStream file2 = new FileInputStream(filename); // 初始化文件流
        ObjectInputStream in = new ObjectInputStream(file2); // 获得对象流
        ArrayList<String> l = (ArrayList<String>) in.readObject(); // 从文件读取对象,并转型为列表
        System.out.println(l); // 打印列表
        in.close(); // 关闭输入流
    }
}

在此例子中,我们首先定义了一个 ArrayList 对象,并将三个字符串加入到列表中。然后,我们创建了一个名为 filename 的文件名,并使用 FileOutputStream 创建一个写入此文件的输出流。接下来,我们使用 ObjectOutputStream 创建了一个对象输出流,并将其与文件输出流关联。然后,我们将列表写入文件中,并关闭了输出流。在反序列化时,我们使用 FileInputStream 创建一个输入流,然后使用 ObjectInputStream 创建了一个对象输入流,并将其与文件输入流关联,最后将反序列化的对象转换为 ArrayList 类型并将其打印在屏幕上。

示例 2:序列化和反序列化自定义对象

接下来,我们将演示如何序列化和反序列化自定义对象。在本例子中,我们将演示如何序列化和反序列化一个名为 Employee 的自定义对象。

import java.io.*;

class Employee implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int salary;

    public Employee(String name, int salary) {
        this.name = name;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee [name=" + name + ", salary=" + salary + "]";
    }
}

public class SerializationDemo {
    public static void main(String[] args) throws Exception {
        String filename = "test.txt"; // 定义一个文件名字
        Employee e = new Employee("Mike", 50000);
        // 序列化操作
        FileOutputStream file = new FileOutputStream(filename); // 初始化文件流
        ObjectOutputStream out = new ObjectOutputStream(file); // 获得对象流
        out.writeObject(e); // 将员工对象写入文件
        out.close(); // 关闭输出流

        // 反序列化操作
        FileInputStream file2 = new FileInputStream(filename); // 初始化文件流
        ObjectInputStream in = new ObjectInputStream(file2); // 获得对象流
        Employee e1 = (Employee) in.readObject(); // 从文件读取对象,并转型为 Employee 对象
        System.out.println(e1); // 打印 Employee 对象
        in.close(); // 关闭输入流
    }
}

在本例子中,我们首先定义了一个名为 Employee 的自定义对象,并让其实现 Serializable 接口。Employee 对象包含两个字段,即员工姓名和工资。接下来,我们创建了一个名为 filename 的文件名,并使用 FileOutputStream 创建一个写入此文件的输出流。然后,我们使用 ObjectOutputStream 创建了一个对象输出流,并将其与文件输出流关联。在写入员工对象之后,我们关闭了输出流。在反序列化时,我们使用 FileInputStream 创建一个输入流,然后使用 ObjectInputStream 创建了一个对象输入流,并将其与文件输入流关联,最后将反序列化的对象转换为 Employee 类型并将其打印在屏幕上。

总结

本文深入讲解了 Java 对象的序列化和反序列化。首先解释了什么是序列化和反序列化的含义和用途,接着阐述了序列化和反序列化的实现基础。然后,通过示例演示了如何序列化和反序列化 ArrayList 和自定义对象。本文的内容对于需要进行 Java 对象持久化或在计算机网络上进行 Java 对象传输的读者特别有用。

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

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

相关文章

  • Java8新特性之Base64详解_动力节点Java学院整理

    Java8新特性之Base64详解 介绍 Base64是用来将二进制数据编码为可打印ASCII字符的一种方法。Java8在java.util下新增了Base64类,提供了Base64编解码的实现。 Base64的编码与解码 Base64可以将任意二进制数据编码为ASCII字符,编码后的长度会比原始数据大1/3。编码方式如下: 将要编码的数据划分成每6个比特为…

    Java 2023年5月20日
    00
  • Java中的函数式编程

    下面是Java中函数式编程的完整攻略及示例。 函数式编程概述 函数式编程是一种编程范式,其核心思想是把计算机运算看作是数学上的函数计算。函数式编程的一个关键特点是它支持高阶函数,即函数可以作为另一个函数的参数或返回值。Java 8引入了Lambda表达式和函数式接口,使得Java也支持函数式编程。 Lambda表达式 Lambda表达式是Java 8引入的一…

    Java 2023年5月19日
    00
  • Maven默认中央仓库(settings.xml 配置详解)

    Maven是一个流行的Java构建工具,它使用中央仓库来管理项目所需的依赖库。在使用Maven时,默认使用中央仓库(Central Repository),本文将介绍如何在settings.xml文件中配置Maven默认中央仓库。 1. settings.xml文件 在Maven中,settings.xml文件用于配置Maven的全局设置(如本地仓库路径、镜…

    Java 2023年5月20日
    00
  • Ajax+Servlet实现无刷新下拉联动效果

    下面是详细的攻略。 一、什么是无刷新下拉联动效果 “无刷新下拉联动效果”指的是在一个下拉框中选择某一项时,另一个下拉框中的内容会实时地发生改变,而不需要重新加载整个页面。Ajax+Servlet是实现这一效果的主要技术手段。 二、实现步骤 1.创建HTML页面 首先,需要在HTML页面中创建两个下拉框及其对应的显示文本框。 <form> <…

    Java 2023年6月15日
    00
  • JavaWeb实现学生信息管理系统(1)

    JavaWeb实现学生信息管理系统需要以下步骤: 1. 环境搭建 首先需要搭建好JavaWeb开发环境,包括JDK和IDE等工具,以及Tomcat服务器。可以参考相关教程进行安装配置。 2. 创建项目 在IDE中创建一个新的JavaWeb项目,并创建所需的数据库表。可以使用MySQL等关系型数据库进行创建,具体表结构可以根据实际需求进行设计。 3. 编写Ja…

    Java 2023年5月20日
    00
  • MIME Base64编码

    Base64是一种用于将二进制数据编码成可打印ASCII字符的编码方式。它由64个字符组成,包括A-Z、a-z、0-9以及+和/。它的编码规则非常简单:将3个字节的二进制数据(共24位)分成4组,每组6位,然后将这4组6位的值转换成一个可打印ASCII字符。 MIME Base64是Base64的一种变体,它是Multipurpose Internet Ma…

    Java 2023年4月25日
    00
  • 搭建MyBatis-Plus框架并进行数据库增删改查功能

    搭建MyBatis-Plus框架并进行数据库增删改查功能的完整攻略如下: 准备工作 下载和安装JDK和MySQL; 创建一个Spring Boot项目; 在项目中添加mybatis-plus-boot-starter依赖; 在项目的配置文件中配置数据库连接信息。 配置MyBatis-Plus框架 创建数据库表; 创建实体类,并在类上添加@TableField…

    Java 2023年6月1日
    00
  • javascript框架设计读书笔记之种子模块

    《JavaScript框架设计读书笔记》中的“种子模块”是指一个可以独立运行的封装好的模块,可以作为一个基础模块,在不同的应用场景下被复用和拓展。这里提供一个完整的种子模块设计攻略,具体包括以下几步: 1.确定需求与通用性 首先需要明确自己的需求和所要设计模块的通用性。分析模块所需功能,设计出尽可能通用的接口和参数,使得该种子模块可以在多个应用场景下使用。 …

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