首页 > 编程语言 >Java序列化和反序列化

Java序列化和反序列化

时间:2023-05-25 12:55:04浏览次数:38  
标签:Java 对象 JSON 显式 序列化 serialVersionUID

序列化和反序列化的定义

* Java序列化就是指把Java对象转换为字节序列的过程
* Java反序列化就是指把字节序列恢复为Java对象的过程。

 

以下是我们常见的一行代码:

private static final long serialVersionUID = 1L;

关于这行代码,这是java源码中的一段话:

如果可序列化类没有显式声明 serialVersionUID,那么序列化运行时将根据类的各个方面计算该类的默认serialVersionUID值,如Java对象序列化规范中所述。

此规范将枚举类型的seriaversionUID定义为0L。但是。强烈建议除枚举类型之外的所有可序列化类都显式声明 serialVersionUID 值,
因为默认的 serialVersionUID 计算对类细节非常敏感,这些细节可能因编译器实现而有所不同。

因此在反序列化过程中可能会导致意外的InvalidClassException。因此,为了保证不同iava编怪器实现中的serlalVersionUID值一致。
可序列化类必须声明显式 serialVersionUID 值。
强烈建议显示serialVersionuID声明尽可能使用私有修符。因为此声明仅适用于当前类,serialVersionUID 字段作为继承成员没有用处。

这是一个 Java 语言中关于序列化版本UID的常量声明。 这个值是用于标识 Java 对象的序列化版本。 当一个对象被序列化时,版本 UID 会被写入序列化的数据流中并被用于反序列化时的版本检查。 如果反序列化的对象的版本 UID 与序列化时的版本 UID 不一致,那么反序列化会失败,抛出 InvalidClassException 异常。

为了避免这种情况,开发者可以指定 serialVersionUID,以便在类的改动发生时,显式的指定序列化版本号;这样就可以保证当对象序列化的版本号和反序列化的版本号一直时,即使类的内部改动,依然能够反序列化成功。这是Java中,Serializable接口实现的一部分。

总结: 在使用 Java 自带的序列化机制时,需要显式地指定 serialVersionUID 以确保版本兼容性。

 

其他序列化工具

  • fastJson 

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。fastJson 底层并不使用 ObjectInputStream 进行对象的反序列化,它使用的是自己实现的反序列化机制。

当 fastJson 将 Java 对象转化为 JSON 字符串时,它会根据对象的属性、类型等信息来构造一个对应的 JSON 对象。而当 fastJson 将 JSON 字符串转化为 Java 对象时,它会先将 JSON 解析为一个 JSONObject,并使用反射获取 Java 类的信息,然后再根据 Java 类的属性、类型等信息来构造对应的 Java 对象。

  • Jackson

jackson(springboot默认的序列化工具),jackson底层采用的是ObjectMapper技术进行序列化以及反序列化的。

Tips:在使用这些序列化工具时,是不需要显式地指定 serialVersionUID。

标签:Java,对象,JSON,显式,序列化,serialVersionUID
From: https://www.cnblogs.com/danielzzz/p/17430801.html

相关文章

  • 归并排序Java版(图文并茂思路分析)
    归并排序工作原理:工作原理是将一个大问题分解成小问题,再将小问题分解成更小的。(乍一看就觉得是像一个递归)就像下图这样。然后不断的将其一份为二,分解成更小的排序。我们设一个函数叫MergeSort(arr,l,r)意思就是将arr数组下标为[l,r]之间的数进行排序。那么就开始不断的调用自......
  • XML和javaConfig
    1. 为什么要使用 Spring Boot  11. 因为Spring, SpringMVC 需要使用的大量的配置文件 (xml文件)还需要配置各种对象,把使用的对象放入到spring容器中才能使用对象需要了解其他框架配置规则。2. SpringBoot 就相当于 不需要配置文件的Spring+SpringMVC。 常用的框架和第三......
  • java arrays arraycopy 复制数组
    publicstaticvoidmain(Stringargs[]){int[]source={1,2,3,4,5,6,7};int[]target=newint[5];System.arraycopy(source,0,target,0,5);//6,7超出5的长度,被省略了System.out.println(Arrays.toString(target));for(......
  • java.lang.NoClassDefFoundError: okhttp3/Callback(已解决)
    今天在向MinIO上传文件时出现:java.lang.NoClassDefFoundError:okhttp3/Callback 但是的确已经导过包了,如图: 经过测试,应该时版本问题所致,这里修改版本以后成功解决。  ......
  • java数组添加元素
    importjava.util.ArrayList;importjava.util.Vector;importjava.util.Arrays;publicclassImoocStudent{publicstaticvoidmain(Stringargs[]){intarray[]={2,5,4,-2,-3,-29,20};Arrays.sort(array);printArr("数组排序的结果......
  • 一篇文章解密 - 如何在MyEclipse中使用JavaScript编写代码?
    MyEclipsev2022.1.0正式版下载MyEclipse技术交流群:742336981欢迎一起进群讨论JavaScript项目在MyEclipse2021及更高版本中,JavaScript支持对大多数JavaScript源代码都是开箱即用的——不需要特殊的JavaScriptEclipse项目或JavaScriptfacet。但是,我们建议使用jscon......
  • day 105 - javaBean
    javaBean是一种实体类JavaBean有特定的写法必须有一个无参构造属性必须私有化必须有对应的get,set方法一般用来和数据库字段做映射:ORMORM:对象关系映射表-->类字段-->属性行记录-->对象实现创建数据库,创建对应实体类 //实体类,和数据库中的表结构......
  • java函数式编程stream流操作lambda表达式使用方法引用用法等练习
    java函数式编程stream流操作lambda表达式使用方法引用用法等练习 @Testvoidtest01(){System.out.println("111");List<Author>authors=getAuthor();//stream流打对象中一个字段authors.stream().distinct().forEach(author......
  • 力扣239(Java)- 滑动窗口最大值(困难)
    题目:给你一个整数数组nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例1:输入:nums=[1,3,-1,-3,5,3,6,7],k=3输出:[3,3,5,5,6,7]解释:滑动窗口的位......
  • java基本原理及三大框架原理和数据库基本知识点总结
    这个也是超详细的,自己遇到的问题,然后总结下来的,有查的和自己理解的,很多点,对于做javaweb开发的同学很有帮助。笔记如下:1、面向对象的特征有哪些方面1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选......