实例分析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日

相关文章

  • 通过js动态创建标签,并设置属性方法

    通过js动态创建标签并设置属性方法是一个常见的操作。下面是这个过程的详细攻略: 1. 创建元素 要动态创建标签,我们需要使用JavaScript中的createElement()方法。该方法用于创建新的HTML元素,并指定元素的标签名称。例如,创建一个 元素可以使用以下代码: const paragraph = document.createElement(…

    Java 2023年6月15日
    00
  • Java 网络爬虫基础知识入门解析

    Java 网络爬虫基础知识入门解析 概述 网络爬虫是一种通过编程方式自动化提取互联网上数据的技术。对于Java开发者而言,使用Java的网络爬虫应该会是最自然的想法。本文将介绍Java网络爬虫的基础知识,以及如何使用Java实现一个网络爬虫。 爬虫原理 一个基本的网络爬虫需要完成以下几个步骤: 发送HTTP请求获取页面内容 解析获取到的页面内容 保存所需的数…

    Java 2023年5月23日
    00
  • Jenkins远程部署war包过程图解

    下面是“Jenkins远程部署war包过程图解”的完整攻略: 1. 概述 Jenkins是一款自动化构建工具,可以实现代码的编译、测试、构建、部署等一系列自动化流程。Jenkins支持远程部署,可以将构建好的war包部署到远程服务器上。 2. 准备工作 在开始远程部署之前,需要做以下准备工作: 确认jenkins服务器和目标服务器之间能够互相访问 在目标服务…

    Java 2023年6月2日
    00
  • Java中Lambda表达式使用详细解读

    Java中Lambda表达式使用详细解读 Lambda 表达式是 Java 8 中新增的重要特性,是一种类似于匿名内部类的语法结构,可用于简化某些代码的写法。本文将详细讲解Lambda表达式的使用方法。 Lambda表达式的语法 基本语法: (parameters) -> expression 或者 (parameters) -> { state…

    Java 2023年5月27日
    00
  • Java线程安全与非线程安全解析

    Java线程安全与非线程安全解析 Java的线程安全问题是非常重要的一个主题,尤其是在多线程程序的开发中。本文将从线程安全和非线程安全的概念入手,深入探讨Java线程安全与非线程安全的区别,并以代码示例详细说明。 线程安全与非线程安全 Java中的线程安全问题可以简单理解为多线程同时访问同一块内存时所出现的问题。如果多个线程并发地访问同一块内存时,程序仍然能…

    Java 2023年5月19日
    00
  • JavaMail入门教程之解析邮件(5)

    JavaMail入门教程之解析邮件(5) 在这篇教程中,我们将学习如何使用JavaMail解析邮件内容。JavaMail提供了多种解析邮件内容的方法。我们将介绍以下三种方法: 使用getContentType()获取邮件的内容类型,并根据邮件的类型进行解析; 使用getContent()获取邮件的内容,并根据邮件类型进行解析; 使用MimeMessagePa…

    Java 2023年6月15日
    00
  • Java 实战范例之校园二手市场系统的实现

    Java 实战范例之校园二手市场系统的实现 项目简介 本项目是一款基于Java的校园二手市场系统。该系统具有商品发布、购买、评论、搜索、推荐等功能,旨在为用户提供一个安全、高效、便捷的交易平台。 项目架构 服务器 本项目采用SpringBoot作为Web应用的框架,使用MySQL作为后端数据库,Spring Security负责安全认证、用户名密码加密等功能…

    Java 2023年5月24日
    00
  • 云服务器部署 Web 项目的实现步骤

    云服务器是一种虚拟计算机,可以在云中部署和运行各种应用程序。以下是使用云服务器部署Web项目的完整步骤: 步骤一:选择云服务器 首先,需要在各大云服务提供商中选择适合自己的云服务器。建议选择有完善的技术支持、稳定可靠、可扩展性强的云服务商。常见的云服务商有阿里云、腾讯云、亚马逊云等,可以根据自己的需求进行选择。 步骤二:配置云服务器 选择好云服务器后,需要进…

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