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

yizhihongxing

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日

相关文章

  • JVM的垃圾回收算法一起来看看

    JVM的垃圾回收算法 在Java编程中,内存管理是一个非常重要的问题。Java虚拟机(JVM)的垃圾回收算法可以用来管理和清理不再使用的内存空间。本文将带你了解JVM的垃圾回收算法并提供一些示例。 垃圾回收算法 标记-清除(Mark and Sweep) 这是最早的垃圾回收算法之一,也是最容易实现的算法之一。该算法包括两个步骤:标记和清除。 标记阶段扫描堆中…

    Java 2023年5月19日
    00
  • spring-boot 如何实现单次执行程序

    Spring Boot 如何实现单次执行程序 在本文中,我们将详细讲解如何使用Spring Boot实现单次执行程序。我们将介绍两种不同的方法来实现这个目标,并提供示例来说明如何使用这些方法。 方法一:使用CommandLineRunner接口 Spring Boot提供了CommandLineRunner接口,它可以在Spring Boot应用程序启动时执…

    Java 2023年5月18日
    00
  • 详细分析Java 泛型的使用

    详细分析Java 泛型的使用 一、什么是Java泛型 Java泛型是Java SE 5引入的一种新特性,它为Java的类型系统引入了参数化类型的概念。我们在定义类、接口、方法时,可以指定使用泛型来处理这些类型参数,从而使得代码更加通用。 二、为什么要使用Java泛型 类型安全:泛型可以让代码更加健壮和安全,因为泛型会在编译时期进行类型检查。 代码复用:通过使…

    Java 2023年5月26日
    00
  • JSP 中Servlet的自己实现

    JSP 中Servlet的自己实现 Servlet是Java中常用的服务器端程序,可以接收和处理HTTP请求,并返回相应的 HTTP响应。JSP(Java Server Pages) 是一个动态的Java web页面技术,可以在网页中嵌入 Java 代码片段,用于生成动态内容。 在JSP中使用Servlet,通常有两种方式:一是在JSP页面中直接使用标签引入…

    Java 2023年6月15日
    00
  • Java简单工厂模式详细解释

    Java简单工厂模式详细解释 简介 简单工厂模式是创建型模式的一种,它提供了一种创建对象的最佳方法。在简单工厂模式中,我们在创建对象的时候不会对客户端暴露创建逻辑,而是通过一个公共的静态方法返回一个新的对象。简单工厂模式属于类的创建型模式,在工厂类中,选择创建哪一种产品类的实例化是由工厂来决定的,而并非由客户端来决定。 实现 简单工厂模式的实现需要下面几个角…

    Java 2023年5月19日
    00
  • Json字符串与Object、List、Map的互转工具类

    介绍:在Java中,经常会使用Json格式的字符串来传输数据,但是在Java程序内部我们又需要把Json字符串转换为Java对象来方便的操作数据。本文将介绍如何使用Json相关的工具类将Json字符串转换为Java对象,并将Java对象转换为Json格式的字符串。 将Json字符串转换为Java对象 当我们有一个Json格式的字符串需要转换为Java对象时,…

    Java 2023年5月26日
    00
  • Java反射概念与使用实例代码

    Java反射是Java语言自带的一种强大的机制,允许在运行时动态地获取类的信息、访问或修改类的属性和方法等。本文将详细讲解Java反射的概念和使用,包含以下内容: 反射概述 反射实现方式 反射的作用与优缺点 反射使用的实例代码 反射概述 Java反射(Reflection)是Java语言中的一种机制。它可以让我们在运行时动态地获取类的信息、访问或修改类的属性…

    Java 2023年5月30日
    00
  • Java封装数组实现在数组中查询元素和修改元素操作示例

    下面是详细讲解“Java封装数组实现在数组中查询元素和修改元素操作示例”的完整攻略。 1. 简介 在Java中,数组是一种基本的数据结构。数组中存储的元素都是具有相同数据类型的,可以通过下标来访问数组中的每个元素。但是,使用数组还存在一些不足,例如数组的长度是固定的,无法动态扩展;数组元素的类型一旦确定就无法更改等。因此,我们可以通过封装数组的方式来实现数组…

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