java对象的序列化和反序列化

下面是Java对象的序列化和反序列化的完整攻略:

概述

Java对象的序列化和反序列化是一种将对象转化成字节序列以便存储和传输的机制,同时也是将字节序列转化为对象的一种机制。

Java序列化通常用于将对象存储到文件中或者通过网络传输数据,反序列化则是将序列化后的字节流转换成原来的对象。

如何序列化和反序列化对象

Java对象的序列化和反序列化可以通过Java的标准库实现,具体使用方法如下:

序列化

将Java对象进行序列化,需要执行下面两个步骤:

  1. 实现Serializable接口

Java对象必须实现Serializable接口才可以进行序列化,Serializable是一个空的接口,只是起到可以序列化的标记作用,该接口中没有任何方法或属性。若未实现Serializable接口,会在序列化时抛出java.io.NotSerializableException异常。

  1. 调用ObjectOutputStream类实现序列化

使用ObjectOutputStream类可以方便的将Java对象进行序列化,使用该类进行序列化的基本步骤如下:

OutputStream outputStream = new FileOutputStream("file.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(object);
objectOutputStream.flush();
objectOutputStream.close();

上述代码中,writeObject方法将对象进行序列化,flush方法将缓存数据写入磁盘,close方法关闭输出流。序列化后的对象将保存在file.txt文件中。

反序列化

将Java对象进行反序列化,需要执行下面两个步骤:

  1. 调用ObjectInputStream类实现反序列化

使用ObjectInputStream类方便的可以将序列化后的数据转换成Java对象,使用该类进行反序列化的基本步骤如下:

InputStream inputStream = new FileInputStream("file.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Object object = objectInputStream.readObject();
objectInputStream.close();

上述代码中,readObject方法将从文件中读取序列化后的数据,并将其转换成Java对象返回,close方法关闭输入流。反序列化的对象为object

  1. 反序列化后需要进行强制类型转换

因为反序列化后得到的对象是Object类型,所以需要将其强制转换成原先的数据类型,示例代码如下:

Student student = (Student) object;

示例

下面我们来看两个示例:

示例一

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

// 定义Student类
class Student implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void display() {
        System.out.println("name:" + name + ", age:" + age);
    }
}

public class SerializeDemo {
    public static void main(String[] args) throws Exception {
        Student student = new Student("Tom", 18);
        // 序列化
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("student.txt"));
        objectOutputStream.writeObject(student);
        objectOutputStream.flush();
        objectOutputStream.close();

        // 反序列化
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("student.txt"));
        Student s = (Student) objectInputStream.readObject();
        s.display();
        objectInputStream.close();
    }
}

代码解析:

该例子定义了一个Student类,实现了Serializable接口,通过定义display方法,来展示反序列化后的数据。

该例子通过ObjectOutputStream类实现了序列化,将Student对象序列化并保存到文件中,通过ObjectInputStream类实现了反序列化,从文件中读取序列化的数据并将其转换为Student对象。

示例二

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

// 定义Student类
class Student implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void display() {
        System.out.println("name:" + name + ", age:" + age);
    }
}

public class SerializeDemo {
    public static void main(String[] args) throws Exception {
        Student student = new Student("Tom", 18);
        // 序列化
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(student);
        objectOutputStream.flush();
        objectOutputStream.close();

        // 反序列化
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        Student s = (Student) objectInputStream.readObject();
        s.display();
        objectInputStream.close();
    }
}

代码解析:

该例子同样定义了一个Student类,实现了Serializable接口,通过定义display方法,来展示反序列化后的数据。

该例子通过ByteArrayOutputStream类实现了序列化,将Student对象序列化并保存到内存中,通过ByteArrayInputStream类实现了反序列化,从内存中读取序列化的数据并将其转换为Student对象。

至此,Java对象的序列化和反序列化的攻略已经介绍完毕。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java对象的序列化和反序列化 - Python技术站

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

相关文章

  • Spring整合Dubbo框架过程及原理解析

    下面是关于“Spring整合Dubbo框架过程及原理解析”的完整攻略: 1. Dubbo框架简介 Dubbo是一款开源的、高性能的Java RPC框架。Dubbo提供了完整的服务治理方案,包括服务注册与发现、服务路由、负载均衡、容错机制等。Dubbo的核心是基于高效的序列化与网络通信框架实现的高性能远程过程调用(RPC)。 2. Spring整合Dubbo …

    Java 2023年5月19日
    00
  • 利用Redis实现延时处理的方法实例

    关于如何利用Redis实现延时处理,可以采取以下步骤: 步骤1:安装和配置Redis 首先需要确保Redis服务器已经正确安装在本地或远程服务器上,并正确配置了Redis的相关参数。可以通过以下命令检查Redis服务器是否已安装: redis-cli ping 如果已经安装,会返回“PONG”字样。如果未安装,可以参考官方文档进行安装和配置:https://…

    Java 2023年5月26日
    00
  • 什么是代码优化?

    以下是关于代码优化的完整使用攻略: 什么是代码优化? 代码优化是指通过改进代码的设计、算法、数据结构、代码实现等方面,提高代码的运行效率和响应速度,减少资源占用和延迟等问题。代码优化的目的是提高程序的性能,使其更加高效、稳定和可靠。 代码优化的原则 代码优化需要遵循以下原则: 不要过早优化:在代码编写的早期,不要早地考虑优化问题,应该先保证代码的正确性和可读…

    Java 2023年5月12日
    00
  • JVM类加载机制原理及用法解析

    JVM类加载机制原理及用法解析 Java虚拟机是Java语言实现”Write Once, Run Anywhere”程序设计理念的一个关键组成部分,而Java虚拟机中最重要的一个子系统就是类加载子系统。该子系统负责对字节码文件(.class文件)中的类进行加载、验证、准备、解析、初始化等操作,从而在程序的运行中实现类的动态加载和管理。那么,下面我们就来详细讲…

    Java 2023年6月15日
    00
  • Spring boot监控Actuator-Admin实现过程详解

    Spring Boot监控Actuator-Admin实现过程详解 Spring Boot Actuator是Spring Boot提供的一个用于监控和管理应用程序的框架。Actuator提供了许多有用的端点,例如/health、/metrics、/info等。Actuator-Admin是一个基于Actuator的UI,它提供了一个可视化的界面,用于监控和…

    Java 2023年5月15日
    00
  • Javaweb EL自定义函数开发及代码实例

    下面我将为您详细讲解“Javaweb EL自定义函数开发及代码实例”的完整攻略。 1. 什么是EL表达式 EL表达式全称是Expression Language,即表达式语言,它是JSP规范中的一个语言,用于简化JSP页面中的Java代码。EL表达式可以获取、设置、计算JavaBean的属性值,访问作用域中的变量及常量,调用JavaBean的方法等等。 2.…

    Java 2023年6月15日
    00
  • jQuery表格插件datatables用法总结

    jQuery表格插件datatables用法总结 什么是datatables datatables是一款基于jQuery库的表格插件,它通过客户端无刷新式展示表格数据,并提供了搜索、分页、排序等功能,能够大大简化web应用程序的开发过程。 如何使用datatables 数据源准备 datatables可以直接使用HTML表格中的数据作为数据源,也可以通过AJ…

    Java 2023年6月16日
    00
  • Java提效神器Stream的一些冷门技巧汇总

    Java提效神器Stream的一些冷门技巧汇总 什么是Java Stream Java Stream是Java 8引入的一个新的集合处理方式,它可以用来处理很大的数据流,并行处理数据以及实现简洁的函数式编程。 Stream的主要优点是可以大大简化代码,同时可以在处理大数据集时提高性能。Stream是延迟执行的,也就是说它不会立即处理所有的数据,而是在需要的时…

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