Java序列化与反序列化的实例分析讲解

Java序列化与反序列化的实例分析讲解

Java序列化是Java中一种比较常用的处理对象持久化问题的方式,序列化是将一个对象转换成字节流表示的过程,反序列化是将字节流重新转化成对象的过程,使得对象在不同计算机、不同应用程序之间传输成为可能。

序列化的实现方法

在Java中,序列化的实现主要有两种方式:

  1. 实现Serializable接口。Serializable是Java中的接口,它标识了类的实例可以序列化。若要序列化对象,需要将该对象所属类实现Serializable接口,并声明一个serialVersionUID字段。

  2. 实现Externalizable接口。如果一个类实现了Externalizable接口,则它必须实现readExternal()和writeExternal()方法。使用Externalizable接口实现序列化可以更灵活地控制序列化的过程。

下面是一个实现Serializable接口的示例。

import java.io.*;

class Employee implements Serializable{
   public String name;
   public String address;
   public transient int SSN;
   public int number;

   public void mailCheck(){
      System.out.println("Mailing a check to " + name + " " + address);
   }
}

如果一个类的某个字段不应该序列化,可以使用关键字transient修饰该字段,如上面的SSN字段。

序列化的示例

import java.io.*;

public class SerializeDemo {

    public static void main(String [] args) {
        Employee e = new Employee();
        e.name = "John Doe";
        e.address = "101 Main St.";
        e.SSN = 11122333;
        e.number = 101;

        try {
            FileOutputStream fileOut =
            new FileOutputStream("employee.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(e);
            out.close();
            fileOut.close();
            System.out.printf("Serialized data is saved in employee.ser");
        } catch (IOException i) {
            i.printStackTrace();
        }
    }
}

以上代码创建了一个Employee对象,并通过对象输出流将该对象序列化存储到employee.ser文件中。

反序列化的示例

import java.io.*;

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();
            in.close();
            fileIn.close();
        } 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对象并进行反序列化。注意,如果读取到的字节流无法被反序列化为对象,会抛出ClassNotFound异常。

以上就是Java序列化与反序列化的实例分析,希望对你有所帮助。

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

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 微信小程序之this.setdata

    以下是微信小程序中使用this.setData()方法的完整攻略,包含两个示例: 步骤1:了解this.setData()方法 this.setData()方法是微信小程序中用于更新页面数据的方法。它接受一个对象作为参数,该对象包含要更新的数据。例如: this.setData({ message: ‘Hello, World!’ }) 在这个示例中,我们使…

    other 2023年5月6日
    00
  • mysql去重的方法整理

    以下是“MySQL去重的方法整理”的完整攻略: 1. 去重的概念 在MySQL中,去重是指从查询结果中删除重复的行。当查询结果包含多个相同的行时,去重可以帮助我们只显示一次这些行,从而使查询结果更加简洁和易读。 2. MySQL去重的方法 MySQL提供了多种去重的方法,包括使用DISTINCT关键字、GROUP BY子句和HAVING子句等。下面分别介绍这…

    other 2023年5月8日
    00
  • Sybase:循环调用存储过程

    Sybase:循环调用存储过程 Sybase数据库中,我们经常需要使用存储过程来实现复杂的业务逻辑。而在某些场景下,我们可能需要对一个存储过程进行循环调用,以便在不同的参数下执行相同的业务逻辑。本文将介绍如何在Sybase数据库中循环调用存储过程。 准备工作 在进行循环调用存储过程之前,我们需要创建一个需要循环调用的存储过程。以下是一个简单的示例存储过程: …

    其他 2023年3月28日
    00
  • PHP父类调用子类方法的代码例子

    首先,类的继承是面向对象编程中很重要的一个概念。PHP中,我们通过 extends 关键字来实现继承关系。假设下面有一段代码,它定义了一个基类 Animal 和它的子类 Dog,其中定义了基类的一个公共方法 run(): class Animal { public function run() { echo "Animal is running&q…

    other 2023年6月26日
    00
  • Linux下快速比较两个目录的不同(多种方法)

    这里提供一份在Linux下快速比较两个目录的不同的攻略,主要介绍两种方法,分别是使用diff和rsync命令。 使用diff命令 diff命令可以用来比较两个文件之间的差异,我们可以使用它来比较两个目录中的文件。使用方法如下: diff -r dir1/ dir2/ 其中dir1/和dir2/分别代表需要比较的两个目录,-r参数是递归比较子目录。执行以上命令…

    other 2023年6月26日
    00
  • 使用Portainer部署Docker容器的项目实践

    使用Portainer部署Docker容器的项目实践攻略 1. 简介 Portainer是一个易于使用的Docker管理用户界面,可轻松管理Docker实例,容器,图像,卷和网络等资源。在本文中,我们将探讨如何使用Portainer将您的Docker容器部署到生产环境中。 2. 安装Portainer 为了使用Portainer,我们需要安装它。您可以通过以…

    other 2023年6月20日
    00
  • JS数组在内存中的效率问题浅析

    JS数组在内存中的效率问题浅析 在Javascript中,数组是一种非常常用的数据结构。但是,在使用数组时,我们需要考虑它在内存中的效率问题。本文将从以下几个方面进行讲解: Javascript中的数组 数组的内存分配 数组的读取速度 数组的写入速度 示例分析 1. Javascript中的数组 Javascript中的数组可以存储任意类型的数据,无需预先声…

    other 2023年6月25日
    00
  • Bean实例化之前修改BeanDefinition示例详解

    在Spring框架中,BeanDefinition描述了Spring IoC容器中的Bean的定义。Spring IoC容器使用BeanDefinition来实例化Bean,并把它们纳入到容器中来。在实例化Bean之前,我们可以对BeanDefinition进行修改来自定义BeanDefinition。下面是对“Bean实例化之前修改BeanDefiniti…

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