当前位置:

首页 > 编程开发 > Java序列化与反序列化的实际应用场景和用法介绍

Java序列化与反序列化的实际应用场景和用法介绍

本文目录

    Java序列化与反序列化Java序列化把一个对象JavaObject变为一个二进制字节序列byte[]Java反序列化就是把一个二进制字节序列byte[]变为Java对象JavaObject序列化APIObjectOutputStream字节输出流对象,将对象的输出流写到文件中(结合FileOutputStream使用)实例:ObjectOutputStreamout=newObjectOutputStream(newFileOutputStream("1.txt"));或FileOutputStream

      Java 序列化与反序列化

      Java序列化把一个对象Java Object变为一个二进制字节序列byte[]

      Java反序列化就是把一个二进制字节序列byte[] 变为Java对象Java Object

      序列化API

      ObjectOutputStream

      字节输出流对象,将对象的输出流写到文件中(结合FileOutputStream使用)

      实例:

      ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
      或
      FileOutputStream fout = new FileOutputStream("1.txt");
      ObjectOutputStream out = new ObjectOutputStream(fout);

      此外ObjectOutputStream还提供了writeObject()方法来序列化一个对象,并将它发送到输出流。

      ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
      out.writeObject(new Test("Sentiment",10));        //对Test类中的构造方法进行传参

      ObjectInputStream

      字节输入流对象,将文件中的二进制字节序列进行反序列化操作(结合FileInputStream)

      实例:

      ObjectInputStream in = new ObjectInputStream(new FileInputStream("1.txt"));
      或
      FileInputStream fin = new FileInputStream("1.txt");
      ObjectInputStream oin = new ObjectInputStream(fin);

      此外ObjectInputStream还提供readObject()方法从流中取出下一个对象,并将对象反序列化。它的返回值为Object,因此,需要将它转换成合适的数据类型。

      ObjectInputStream In = new ObjectInputStream(new FileInputStream("1.txt"));
      Test o = (Test)In.readObject();
      System.out.println(o);        //读取后输出实例理解

      实例理解

      Test.java(类想要进行序列化操作,必须实现Serializable接口继承)

      package Sentiment.unserialize.demo01;
      
      import java.io.Serializable;
      
      public class Test implements Serializable {
          private String name;
          private int age;
      
          public Test() {
          }
      
          public Test(String name, int age) {
              this.name = name;
              this.age = age;
          }
      
          @Override
          public String toString() {
              return "Test{" + "name='" + name + '\'' + ", age=" + age + '}';
          }
      
      }

      Serializable.java

      package Sentiment.unserialize.demo01;
      
      import java.io.*;
      
      public class Serializable {
          public static void main(String[] args) throws IOException {
              ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
              out.writeObject(new Test("Sentiment",10));
              out.close();
          }
      }

       UnSerializable.java

      package Sentiment.unserialize.demo01;
      
      import java.io.FileInputStream;
      import java.io.IOException;
      import java.io.ObjectInputStream;
      
      public class UnSerializable {
          public static void main(String[] args) throws IOException, ClassNotFoundException {
              ObjectInputStream In = new ObjectInputStream(new FileInputStream("1.txt"));
              Test o = (Test)In.readObject();
              System.out.println(o);
          }
      }

      运行Serializable.java后便得到二进制字节码文件内容

      Java序列化与反序列化的实际应用场景和用法介绍

      此时在运行UnSerializable.java便得到了二进制字节码反序列化后的内容

      Java序列化与反序列化的实际应用场景和用法介绍

      serialVersionUID

      • 每个可序列化的类在序列化时都会关联一个版本号 , 这个版本号就是 serialVersionUID 属性

      • serialVersionUID 属性必须通过 static final long 修饰符来修饰 。

      • 如果可序列化的类未声明 serialVersionUID 属性 , 则 Java 序列化时会根据类的各种信息来计算默认的 serialVersionUID 值 . 但是 Oracle 官方文档强烈建议所有可序列化的类都显示声明 serialVersionUID 值 .

      实例理解

      在Test.java中定义serialVersionUID 其值为1

      package Sentiment.unserialize.demo01;
      
      import java.io.Serializable;
      
      public class Test implements Serializable {
          public static final long serialVersionUID = 1L;   //定义serialVersionUID 
      
          private  String name;
          private  int age;
      
          public Test() {
          }
      
          public Test(String name, int age) {
              this.name = name;
              this.age = age;
          }
      
          @Override
          public String toString() {
              return "Test{" + "name='" + name + '\'' + ", age=" + age + '}';
          }
      
      }

      此时运行Serializable.java进行序列化操作

      运行完毕后将serialVersionUID的值定义为2—>public static final long serialVersionUID = 2L;,在运行UnSerializable.java会报错

      Java序列化与反序列化的实际应用场景和用法介绍

      Transient (瞬态变量)

      Transient( 瞬态变量 )是一个 Java 关键词 , 它用于标记类的成员变量在持久化到字节流时不要被序列化 ; 在通过网络套接字流传输字节流时 , transient 关键词标记的成员变量不会被序列化 。此为被static修饰的静态变量也不参与序列化操作。

      实例理解

      将Test.java中的name和age变量前分别加上transient和static

      package Sentiment.unserialize.demo01;
      
      import java.io.Serializable;
      
      public class Test implements Serializable {
          public static final long serialVersionUID = 1L;  //定义serialVersionUID 
          private transient String name;                     //加上transient
          private static int age;                             //加上static
      
          public Test() {
          }
      
          public Test(String name, int age) {
              this.name = name;
              this.age = age;
          }
      
          @Override
          public String toString() {
              return "Test{" + "name='" + name + '\'' + ", age=" + age + '}';
          }
      
      }

      此时在执行Serializable.java和UnSerializable.java,输出结果:Sentiment—>null,10—>0

      Java序列化与反序列化的实际应用场景和用法介绍

      readObject()方法重写

      官方允许用户在被序列化的类中重写 readObject() 方法 , 重写后的方法将负责在反序列化时重构当前类对象 . 用户只需要在重写的 readObject() 方法中实现 defaultReadObject() 方法 , 就可以确保反序列化过程正常执行 .

      实例理解

      实现 defaultReadObject() 方法调用,并在Test类中重写该方法,在进行序列化和反序列化操作即可执行命令

      private void readObject(java.io.ObjectInputStream a) throws IOException, ClassNotFoundException{
          a.defaultReadObject();
          Runtime.getRuntime().exec("calc.exe");
      }

      Java序列化与反序列化的实际应用场景和用法介绍

      本文内容来源于网友投稿,如有侵权请联系删除。
      作者最新文章
      编程开发 Java
      相关文章 更多
      链表删除节点的时间复杂度是多少及其详细分析
      链表删除节点的时间复杂度是多少及其详细分析

      详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

      codex如何配置模型参数及文件设置教程
      codex如何配置模型参数及文件设置教程

      想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

      Claude Code AI编程工具实力揭秘与编程助手实测
      Claude Code AI编程工具实力揭秘与编程助手实测

      通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

      winforms教程自学入门与基础开发步骤详解
      winforms教程自学入门与基础开发步骤详解

      本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

      Cursor自动补全设置教程教你快速开启代码补全功能
      Cursor自动补全设置教程教你快速开启代码补全功能

      详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

      pandas的数据格式怎么转换和设置方法教程
      pandas的数据格式怎么转换和设置方法教程

      详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

      VS Code中文设置方法 简体语言包安装与切换教程
      VS Code中文设置方法 简体语言包安装与切换教程

      详细介绍在Visual Studio Code中安装Chinese (Simplified)语言包的方法,包括通过扩展市场搜索、安装及自动重启切换至简体中文界面的完整步骤,帮助开发者快速将编辑器本地化。

      cursor安装过程无法更改安装位置的解决方法
      cursor安装过程无法更改安装位置的解决方法

      针对Cursor安装包默认锁定C盘且无路径选择界面的问题,提供通过手动移动文件并创建目录联结(Symbolic Link)的解决方案,实现将软件安装在其他磁盘分区。

      rust下载安装教程详解及Windows环境配置方法
      rust下载安装教程详解及Windows环境配置方法

      详解Windows系统下Rust语言的安装步骤,重点解析rustup工具链管理机制,解决环境变量配置错误及MSVC链接器缺失问题,提供可复制的命令验证方法与常见报错的因果排查思路。

      vs code怎么配置 chat实用设置教程步骤
      vs code怎么配置 chat实用设置教程步骤

      详解VS Code中Chat插件的安装与核心配置步骤,重点解决API连接失败、响应慢等常见问题,通过优化上下文设置提升代码生成质量,适合希望集成AI辅助工具的开发者阅读。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      macOS软件
      macOS软件

      正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

      Mac软件 更多
      photoshop
      photoshop
      Windows、macOS 、 iPad

      Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

      Blender
      Blender
      Windows、macOS 和 Linux

      Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

      灵活计算器
      灵活计算器
      macOS/iOS/Android

      灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

      WINDOWS 更多
      3dmax(3ds max)
      3dmax(3ds max)
      Windows

      Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

      photoshop
      photoshop
      Windows、macOS 、 iPad

      Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

      Blender
      Blender
      Windows、macOS 和 Linux

      Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。