Java的序列化与反序列化实操

简介: Java的序列化与反序列化实操

0x00 文章内容


  1. 编写代码
  2. 测试结果


0x01 编写代码


1. 编写对象类

a. 编写Block类

package com.shaonaiyi.hadoop.serialize;
import java.io.Serializable;
/**
 * @Author shaonaiyi@163.com
 * @Date 2019/12/13 16:18
 * @Description 定义需要序列化的Block类
 */
public class Block implements Serializable {
    private long blockId;
    private long numBytes;
    private long generationStamp;
    public Block(long blockId, long numBytes, long generationStamp) {
        this.blockId = blockId;
        this.numBytes = numBytes;
        this.generationStamp = generationStamp;
    }
    public long getBlockId() {
        return blockId;
    }
    public long getNumBytes() {
        return numBytes;
    }
    public long getGenerationStamp() {
        return generationStamp;
    }
    @Override
    public String toString() {
        return "Block{" +
                "blockId=" + blockId +
                ", numBytes=" + numBytes +
                ", generationStamp=" + generationStamp +
                '}';
    }
}


2. 编写调用测试代码

a. 编写序列化与反序列化代码

package com.shaonaiyi.hadoop.serialize;
import java.io.*;
/**
 * @Author shaonaiyi@163.com
 * @Date 2019/12/13 16:20
 * @Description 编写序列化与反序列化测试类代码
 */
public class JavaSerializableTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        String fileName = "blockByte.txt";
        serialize(fileName);
//        deSerialize(fileName);
    }
    private static void serialize(String fileName) throws IOException {
        Block block = new Block(78062621L, 39447651L, 56737546L);
        File file = new File(fileName);
        if (file.exists()) {
            file.delete();
        }
        file.createNewFile();
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        objectOutputStream.writeObject(block);
        objectOutputStream.close();
    }
    private static void deSerialize(String fileName) throws IOException, ClassNotFoundException {
        FileInputStream fileInputStream = new FileInputStream(fileName);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        Object object = objectInputStream.readObject();
        Block block = (Block)object;
        System.out.println(block);
    }
}


0x02 测试结果


1. 测试序列化

a. 先把Block类的序列化代码删掉,调用序列化方法,执行发现报错!

即删除public class Block implements Serializable {里的implements Serializable


image.png


b. 加回序列化代码,执行,发现项目与main文件夹同级目录下多了一个blockbyte.txt文件,双击打开:

image.png


发现是乱码,因为此处是二进制的代码文件,但还是会有很多额外的信息的,比如说包名等等。

2. 测试反序列化

a. 打开反序列化方法,执行:

//        serialize(fileName);
        deSerialize(fileName);


image.png


发现可以将Block对象反序列化出来了。

3. 查看生成的文件大小

a. 可以看到blockByte文件大小是120字节


image.png


但是,我们定义的Block类,其实只有24个字节。Long类是8个字节,三个Long类型的属性是24个字节,120与24比较,其实生成的文件已经大了很多了。

4. 测试修改对象代码

a. 尝试修改Block类,如在里面添加一个无参数的构造方法

    public Block() {
    }


b. 然后再反序列化,发现已经没有办法反序列化了,这可不是我们想看到的。

image.png


0xFF 总结


  1. 内置的Java序列化接口是有缺陷的,会写入额外的信息。第一,会使得数据大小膨胀;第二,只要稍微改动一下代码就无法兼容,无法反序列化。两种情形上面都已经演示了,不是我们想要的结果。
  2. 下一篇引入Hadoop的序列化机制,以弥补Java内置的序列化接口的缺陷。请点击跳转
相关文章
|
10月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
822 1
|
11月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
1218 3
|
11月前
|
前端开发 Java API
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
3120 1
|
11月前
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
1824 1
|
11月前
|
消息中间件 Java 数据库
Java 基于 DDD 分层架构实战从基础到精通最新实操全流程指南
本文详解基于Java的领域驱动设计(DDD)分层架构实战,结合Spring Boot 3.x、Spring Data JPA 3.x等最新技术栈,通过电商订单系统案例展示如何构建清晰、可维护的微服务架构。内容涵盖项目结构设计、各层实现细节及关键技术点,助力开发者掌握DDD在复杂业务系统中的应用。
1952 0
|
9月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
428 1
|
9月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
395 1
|
11月前
|
Java 测试技术 API
2025 年 Java 开发者必知的最新技术实操指南全览
本指南涵盖Java 21+核心实操,详解虚拟线程、Spring Boot 3.3+GraalVM、Jakarta EE 10+MicroProfile 6微服务开发,并提供现代Java开发最佳实践,助力开发者高效构建高性能应用。
1387 5
|
11月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
473 3
|
11月前
|
监控 Kubernetes Java
最新技术栈驱动的 Java 绿色计算与性能优化实操指南涵盖内存优化与能效提升实战技巧
本文介绍了基于Java 24+技术栈的绿色计算与性能优化实操指南。主要内容包括:1)JVM调优,如分代ZGC配置和结构化并发优化;2)代码级优化,包括向量API加速数据处理和零拷贝I/O;3)容器化环境优化,如K8s资源匹配和节能模式配置;4)监控分析工具使用。通过实践表明,这些优化能显著提升性能(响应时间降低40-60%)同时降低资源消耗(内存减少30-50%,CPU降低20-40%)和能耗(服务器功耗减少15-35%)。建议采用渐进式优化策略。
617 2