一篇文章带你了解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日

相关文章

  • 解决struts2 拦截器修改request的parameters参数失败的问题

    解决struts2拦截器修改request的parameters参数失败的问题,主要可以通过在拦截器中使用Struts2提供的方法进行修改。 下面是解决该问题的完整攻略: 1. 确认问题 首先要确保拦截器是否正常工作,例如,在拦截器中添加日志语句,查看是否能够输出日志。如果拦截器正常工作,并且对request进行修改却不成功,则说明问题可能出现在修改requ…

    Java 2023年6月2日
    00
  • spring controller层引用service报空指针异常nullpointExceptio问题

    当在Spring的controller层引用service时出现空指针异常,一般是由于Spring没有正确地注入service导致的。下面是解决该问题的攻略。 1.检查配置文件 在web.xml中检查DispatcherServlet是否正确配置,并且检查applicationContext.xml或其他相关配置文件中是否正确配置了bean,bean是否注入…

    Java 2023年5月25日
    00
  • java实现写入并保存txt文件的代码详解

    下面我会详细讲解Java实现写入并保存txt文件的代码详解。 1. 创建文件 要想写入并保存txt文件,首先需要创建一个文件,并确定写入的路径。可以使用Java中的File类来创建一个文件对象。在创建文件前需确定写入文件的路径,可以使用如下代码来实现: File file = new File("D:\\test\\test.txt");…

    Java 2023年5月20日
    00
  • Go Java 算法之字符串解码示例详解

    Go Java 算法之字符串解码示例详解 什么是字符串解码? 字符串解码指的是将一串被编码的字符串进行解码(还原)成原来的字符串。在实际编码过程中,我们需要对字符串进行编码,以便于传输或存储,但需要使用的时候则需要对编码过的字符串进行解码还原成原来的字符串。 Go Java 字符串解码示例 在 Go Java 中有多种解码回字符串的解决方案,比如 URL d…

    Java 2023年5月20日
    00
  • JSP中使用JavaScript动态插入删除输入框实现代码

    下面是“JSP中使用JavaScript动态插入删除输入框实现代码”的完整攻略。 简介 JSP是一种动态网页技术,而JavaScript是一种脚本语言,两者可以结合使用,达到更好的用户交互效果。此次攻略将详细讲解如何在JSP页面中使用JavaScript实现动态插入删除输入框的功能。 实现步骤 实现插入输入框功能 在JSP页面中添加一个按钮,用于触发插入输入…

    Java 2023年6月15日
    00
  • Struts2拦截器 关于解决登录的问题

    为了解决网站用户登录的安全问题,我们可以使用Struts2拦截器。Struts2拦截器可以拦截用户的请求,并做出相应的处理,比如检查用户是否已经登录,如果没有则跳转至登录页面。以下是Struts2拦截器解决登录问题的完整攻略: 1. 编写拦截器 我们先来编写一个处理用户登录的拦截器。该拦截器会检查用户是否已经登录,如果没有登录,则直接跳转至登录页面。 pub…

    Java 2023年6月15日
    00
  • 为什么Java 8取消了永久代?

    为什么Java 8取消了永久代? 在Java 8之前,Java虚拟机有一块非堆内存称为永久代(PermGen),它专门用于存放类的元数据信息、常量池、方法区和静态变量等内容。由于永久代有一定的内存限制,并且它是基于线性扫描和GC Roots扫描来进行垃圾回收的,所以在大量类的场景下容易出现“永久代溢出”的问题。此外,永久代和堆内存的内存管理方式不同,会导致被…

    Java 2023年5月11日
    00
  • Java 控制流程、大数值、数组

    Java 控制流程 Java 控制流程由以下几个部分构成: if…else 语句 switch 语句 for 循环 while 循环 do…while 循环 if…else 语句 if…else 语句是 Java 中最基础的流程控制语句之一,它的语法如下: if (condition) { // 条件成立执行的代码块 } else { // …

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