声明serialVersionUID进行Serializable接口版本控制

news/2024/9/22 21:07:55/

  本文目标:开发人员,在了解serialVersionUID作用的条件下,进行序列化相关类的定义操作,达到版本可控的程度。

文章目录

    • 1 场景
      • 1.1 Apple类定义
      • 1.2 apple对象序列化并存入文件
      • 1.3 读取文件反序列化得到apple对象
    • 2 要点
      • 2.1 类要实现Serializable接口
      • 2.2 类中的serialVersionUID版本要一致
    • 3 总结/练习

1 场景

  Java中的序列化主要应用于以下3个场景:

  (1)对象状态持久化 - 将对象保存到文件或数据库中

  (2)网络传输优化 - 通过序列化减少网络传输数据量

  (3)RPC等的应用基础 - 远程过程调用需要以流的形式处理请求和响应

  本文以将对象保存到文件举例,说明serialVersionUID在序列化、反序列化中,如何起到版本控制的作用。

  首先一起来看正常情况下,Apple对象如何进行序列化,得到二进制数据存入文件;以及如何读取文件,将二进制数据反序列化得到Apple对象。

1.1 Apple类定义

  要进行序列化的对象,对应类需要实现Serializable接口,未实现该接口,无法进行序列化

  serialVersionUID的1L,也会参与序列化,表示版本。

java">package maplegam.com;import java.io.Serializable;public class Apple implements Serializable {private static final long serialVersionUID = 1L;String name;String weight;public Apple(String name, String weight) {this.name = name;this.weight = weight;}public String getName() {return this.name;}public void setName(String name) {this.name = name;}public String getWeight() {return this.weight;}public void setWeight(String weight) {this.weight = weight;}}

1.2 apple对象序列化并存入文件

  使用java io库的ObjectOutputStream进行序列化处理,并将结果存入“abc.txt”文件。

java">package maplegam.com;import java.io.*;public class SerialzableTest {public static void main(String[] args) throws Exception {String writerPath = "D:\\abc.txt";ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(writerPath, true));oos.writeObject(new maplegam.com.Apple("aaa", "3.78"));oos.close();}
}

  abc.txt文件内容如下图所示:

<a class=序列化文件内容" />

1.3 读取文件反序列化得到apple对象

  使用java io库的ObjectInputStream进行反序列化处理,并将得到的apple对象内容打印出来。

java">package maplegam.com;import java.io.FileInputStream;
import java.io.ObjectInputStream;public class SerialzableReadTest {public static void main(String[] args) throws Exception {String writerPath = "D:\\abc.txt";ObjectInputStream ois = new ObjectInputStream(new FileInputStream(writerPath));Object oj = ois.readObject();Apple apple = (Apple) oj;System.out.println("Apple name:"+apple.getName());System.out.println("Apple weight:"+apple.getWeight());ois.close();}
}

2 要点

Serializable_103">2.1 类要实现Serializable接口

  进行序列化的类,没有实现Serializable接口时,会出现报错“java.io.NotSerializableException”。

未实现Serialable接口报错

2.2 类中的serialVersionUID版本要一致

  serialVersionUID版本如果不一致(比如序列化时客户端引用的该类版本为1L,服务端引用的该类版本为2L),会出现报错“java.io.InvalidClassException: maplegam.com.Apple; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2”。

版本不一致报错

3 总结/练习

  在需要序列化的类中,声明serialVersionUID是一个好习惯,能提高代码阅读效率。

  在代码走查阶段,如果发现客户端、服务端该值不一样,就能提前发现问题,不用等到上线报错后,从日志中看出是该问题。

  可以参照前“1 场景”、“2 要点”内容,尝试在序列化过程中,声明serialVersionUID,查看版本一致、不一致的不同处理结果。


http://www.ppmy.cn/news/1510958.html

相关文章

JaCoCo 命令行界面 (CLI) 详细分析与总结

概述 JaCoCo 提供了一个命令行界面&#xff0c;允许用户在命令行中执行基本操作。命令行工具及其所有依赖项打包在 jacococli.jar 中&#xff0c;并随 JaCoCo 下载提供。执行这些工具需要 Java 1.5 或更高版本。 注意事项 虽然提供了 instrument 命令&#xff0c;但 JaCoCo …

使用 Python 进行 PDF 文件加密

使用 Python 解密加密的 PDF 文件-CSDN博客定义一个名为的函数&#xff0c;该函数接受三个参数&#xff1a;输入的加密 PDF 文件路径input_pdf、输出的解密 PDF 文件路径output_pdf和密码password。https://blog.csdn.net/qq_45519030/article/details/141256661 在数字化时代…

vue前端可以完整的显示编辑子级部门,用户管理可以为用户分配角色和部门?

用户和角色是一对多的关系用户和部门是多对多得关系<template><div class="s"><!-- 操作按钮 --><div class="shang"><el-input v-model="searchText" placeholder="请输入搜索关键词" style="width:…

iOS在设置css的filter属性不生效

问题 blur值太大 // css相关代码 {width: 875px;height: 875px;border-radius: 875px;background: #ffda10;filter: blur(250px); }解决 // 启用硬件加速 // 1 {width: 875px;height: 875px;border-radius: 875px;background: #ffda10;filter: blur(250px);will-change: fil…

CSS方向选择的艺术:深入探索:horizontal和:vertical伪类

CSS&#xff08;层叠样式表&#xff09;是构建网页视觉表现的核心工具。随着CSS规范的不断更新&#xff0c;我们拥有了更多的选择器来精确控制网页元素的样式。其中&#xff0c;:horizontal和:vertical伪类是CSS Level 4中引入的两个实验性选择器&#xff0c;它们允许开发者根据…

Unified 阻抗控制 architecture、framework、approach

Unified 阻抗控制&#xff08;Unified Impedance Control&#xff09;作为一种控制策略&#xff0c;其architecture&#xff08;架构&#xff09;、framework&#xff08;框架&#xff09;和approach&#xff08;方法&#xff09;为&#xff1a; 一、Unified 阻抗控制 Archite…

虚幻5|AI巡逻宠物伴随及定点巡逻—初步篇

一.建立AI基本三件套 1.建立AI基本三件套 二.使用AI的基本设置 1.打开我们想要用的AI宠物的蓝图&#xff0c;选中自我Actor,右侧细节处找到AI&#xff0c;选中对应的AI控制器 三.打开AI控制器 写如下 四&#xff0c;AI行为树 1.新建一个任务&#xff0c;命名含巡逻二字即可…

SpringBoot入门笔记

本文是看黑马老师讲课视频学习笔记整理 目录 入门案例 基于IDEA联网 基于Springboot官网创建 基于阿里云创建项目 手工创建 隐藏文件 入门案例解析: parent​编辑 starter 引导类 内嵌tomcat 入门案例 基于IDEA联网 RestController RequestMapping("/books&…