一篇文章带你了解Java 中序列化与反序列化

一篇文章带你了解Java 中序列化与反序列化

引言

在Java编程中,可能需要将对象存储在文件中或通过网络传输。使用序列化来处理这些任务是很常见的方法。本篇文章将介绍Java中的序列化和反序列化的概念和用法,给你提供一个完整的攻略。

Serializable 接口

Java 中的序列化和反序列化要求被序列化的类必须实现 Serializable 接口。实现 Serializable 接口只需要在序列化类的定义中添加一个串行化 ID 和继承 java.io.Serializable 接口。

// Foo.java
import java.io.Serializable;

public class Foo implements Serializable {
    private static final long serialVersionUID = 1L;
    // class definition
}

在上面的代码中,Foo 类实现了 Serializable 接口,在类定义中添加了 serialVersionUID 常量。这将使 Foo 变为“可串行化”。

序列化

当需要将一个 Java 对象转化为字节时,就发生了序列化。序列化使用 ObjectOutputStream 完成。

// SerializeDemo.java
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializeDemo {
    public static void main(String[] args) {
        Employee e = new Employee();
        e.name = "Alice";
        e.address = "1 Main St, Seattle, WA";
        e.SSN = 123456789;
        e.number = 1001;
        try (FileOutputStream fileOut = new FileOutputStream("employee.ser");
             ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
            out.writeObject(e);
            System.out.println("Serialized data is saved in employee.ser");
        } catch (IOException i) {
            i.printStackTrace();
        }
    }
}

在上面这个例子中,我们将一个 Employee 对象序列化并写入文件 employee.ser 中。示例中的 Employee 类需要实现 Serializable 接口。

反序列化

当需要从字节中重新构建一个 Java 对象时,就需要反序列化该字节。反序列化使用 ObjectInputStream 完成。

// DeserializeDemo.java
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class DeserializeDemo {
    public static void main(String[] args) {
        Employee e = null;
        try (FileInputStream fileIn = new FileInputStream("employee.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn)) {
            e = (Employee) in.readObject();
        } catch (IOException i) {
            i.printStackTrace();
            return;
        } catch (ClassNotFoundException c) {
            System.out.println("Employee class not found.");
            c.printStackTrace();
            return;
        }
        System.out.println("Deserialized Employee...");
        System.out.println("Name: " + e.name);
        System.out.println("Address: " + e.address);
        System.out.println("SSN: " + e.SSN);
        System.out.println("Number: " + e.number);
    }
}

在上面的代码中,我们从文件 employee.ser 中反序列化 Employee 对象并打印它们的一些属性。注意,反序列化需要抛出 ClassNotFoundException 异常。当程序无法找到要反序列化的类时,这个异常就会被抛出。

示例一

这里是一个使用序列化的示例,我们将会序列化一个 Employee 对象并写入文件中:

// SerializeDemo.java
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializeDemo {
    public static void main(String[] args) {
        Employee e = new Employee();
        e.name = "Alice";
        e.address = "1 Main St, Seattle, WA";
        e.SSN = 123456789;
        e.number = 1001;
        try (FileOutputStream fileOut = new FileOutputStream("employee.ser");
             ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
            out.writeObject(e);
            System.out.println("Serialized data is saved in employee.ser");
        } catch (IOException i) {
            i.printStackTrace();
        }
    }
}

示例二

下面是一个使用反序列化的示例,我们将从文件 employee.ser 中读取 Employee 对象并打印它们的属性:

// DeserializeDemo.java
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class DeserializeDemo {
    public static void main(String[] args) {
        Employee e = null;
        try (FileInputStream fileIn = new FileInputStream("employee.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn)) {
            e = (Employee) in.readObject();
        } catch (IOException i) {
            i.printStackTrace();
            return;
        } catch (ClassNotFoundException c) {
            System.out.println("Employee class not found.");
            c.printStackTrace();
            return;
        }
        System.out.println("Deserialized Employee...");
        System.out.println("Name: " + e.name);
        System.out.println("Address: " + e.address);
        System.out.println("SSN: " + e.SSN);
        System.out.println("Number: " + e.number);
    }
}

在这两个示例中,我们使用了 SerializeDemo 和 DeserializeDemo 两个 Java 类,它们分别完成了序列化和反序列化的功能。同时,为了序列化我们创建了 Employee 类并注册了 Serializable 接口。

结论

Java 中的序列化和反序列化是将 Java 对象转化为字节并反转以获取原始对象的一种方式。在实现 Serializable 接口、序列化以及反序列化方面,我们应该时刻注意细节。

本文介绍了如何通过 Java 中实现 Serializable 接口的对象使用序列化和反序列化来存储和加载 Java 对象。同时,也演示了如何在 Java 程序中使用这两个技术。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一篇文章带你了解Java 中序列化与反序列化 - Python技术站

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

相关文章

  • Spring与Spring boot的区别介绍

    Spring与Spring Boot是Java开发中广泛使用的两个框架,两者之间有明显的区别。本篇攻略将介绍Spring和Spring Boot的区别,以及为何可能会选择使用Spring Boot。 Spring与Spring Boot的区别 Spring框架 Spring框架是一个广泛使用的框架,有以下几点特点: 宽泛的适用范围:Spring框架可以应用于…

    Java 2023年5月15日
    00
  • Java Arrays.AsList原理及用法实例

    Java Arrays.AsList 原理及用法实例 简介 Arrays.AsList() 是 Java 中的一个常见方法,主要用于将数组转换成List集合。在实际开发中,我们通常将数组转化为 List 后,便可以使用其提供的方法方便地对集合进行操作。 语法 Arrays.asList(T… a); 其中 T 表示传入参数类型,a 表示用于转化的数组对象…

    Java 2023年5月26日
    00
  • Java新手入门学习之正则表达式

    Java新手入门学习之正则表达式 什么是正则表达式? 正则表达式是一种描述字符串模式的语言,可以通过正则表达式来搜索、匹配、替换和分割文本。在Java中,可以使用Java的正则表达式API来完成对于字符串的处理。 Java中正则表达式的基本语法 Java中正则表达式的基本语法如下: pattern.matcher(str).method() 其中patter…

    Java 2023年5月27日
    00
  • Java服务器主机信息监控工具类的示例代码

    下面是Java服务器主机信息监控工具类的示例代码的完整攻略: 1.需求分析 我们需要编写一款可以监控Java服务器主机信息的工具类。在使用这个工具类时,我们希望能够: 获取系统CPU、内存的使用情况; 获取系统硬盘的使用情况; 获取系统网络带宽的使用情况。 2.技术选型 我们可以选择使用Java中的一些相关API实现这个功能,如: Runtime和Manag…

    Java 2023年5月30日
    00
  • Java实现解析dcm医学影像文件并提取文件信息的方法示例

    Sure! 首先需要明确的是,“dcm医学影像文件”是DICOM格式的医学影像文件,其中包含了病人的医学影像信息。其次,Java解析DICOM文件需要用到专门的库,常用的有dcm4che和ImageJ等。 下面是Java实现解析dcm医学影像文件并提取文件信息的步骤和示例: 准备工作 下载dcm4che库(https://sourceforge.net/pr…

    Java 2023年5月20日
    00
  • java实现文件打包压缩输出到浏览器下载

    下面是Java实现文件打包压缩输出到浏览器下载的详细攻略。 一、引入相关依赖 我们需要使用Java自带的ZipOutputStream类和ServletOutputStream类来实现文件压缩和下载功能。 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impo…

    Java 2023年5月26日
    00
  • 浅谈java中unmodifiableList方法的应用场景

    浅谈Java中unmodifiableList方法的应用场景 在Java集合框架中,有一种叫做unmodifiableList的方法可以创建一个只读的List集合,即使尝试对该List进行写操作也会抛出UnsupportedOperationException异常。本篇文章将详细讲解unmodifiableList方法的应用场景。 1. 为何需要只读List…

    Java 2023年5月26日
    00
  • php UEditor百度编辑器安装与使用方法分享

    PHP UEditor百度编辑器安装与使用方法分享 什么是PHP UEditor百度编辑器? PHP UEditor百度编辑器是一个基于JavaScript的所见即所得富文本编辑器,能够在Web浏览器中编辑HTML文本和其他富媒体,如照片和视频。它是一个轻量级、高度定制的编辑器,非常适合PHP开发人员集成到他们的网站中。 安装PHP UEditor百度编辑器…

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