首页 > 编程语言 >java序列化

java序列化

时间:2023-08-23 22:13:28浏览次数:37  
标签:java name 对象 JVM 序列化 Serializable serialVersionUID

序列化和反序列化

  • 序列化:把对象转换为字节序列的过程称为对象的序列化.
  • 反序列化:把字节序列恢复为对象的过程称为对象的反序列化.

什么时候需要用到序列化和反序列化

  • 将内存中的对象持久化到磁盘、数据库或网络传输
  • 对象深拷贝

Serializable 接口

在 Java 中实现了 Serializable 接口后, JVM 在类加载的时候就会发现我们实现了这个接口,然后在初始化实例对象的时候就会在底层帮我们实现序列化和反序列化。

如果被写对象类型不是String、数组、Enum,并且没有实现Serializable接口,那么在进行序列化的时候,将抛出NotSerializableException

需注意:实现Serializable 接口后一般会显示指定一个serialVersionUID,例如:

class Student implements Serializable{
    
    private static final long serialVersionUID = 1L;
    
    private String name;
    private Car car;

    public Car getCar() {
       return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

如果不显示指定 serialVersionUID,JVM 在序列化时会根据属性自动生成一个 serialVersionUID,然后与属性一起序列化,再进行持久化或网络传输. 在反序列化时,JVM 会再根据属性自动生成一个新版 serialVersionUID,然后将这个新版 serialVersionUID 与序列化时生成的旧版 serialVersionUID 进行比较,如果相同则反序列化成功,否则报错.

如果显示指定了 serialVersionUID,JVM 在序列化和反序列化时仍然都会生成一个 serialVersionUID,但值为我们显示指定的值,这样在反序列化时新旧版本的 serialVersionUID 就一致了.

如果我们的类写完后不再修改,那么不指定serialVersionUID,不会有问题,但这在实际开发中是不可能的,我们的类会不断迭代,一旦类被修改了,那旧对象反序列化就会报错。 所以在实际开发中,我们都会显示指定一个 serialVersionUID。

需注意:static修饰的变量不会被序列化,但是JVM 在序列化对象时会自动生成一个 serialVersionUID,然后将我们显示指定的 serialVersionUID 属性值赋给自动生成的 serialVersionUID.

transient关键字

被transient修饰的成员变量,在序列化的时候其值会被忽略,在被反序列化后, transient 变量的值被设为初始值, 如 int 型的是 0,对象型的是 null。

 

 

参考文章:https://blog.csdn.net/Tyson0314/article/details/129053940

 

标签:java,name,对象,JVM,序列化,Serializable,serialVersionUID
From: https://www.cnblogs.com/Explosion556/p/17652896.html

相关文章

  • JAVA SE基础《九》 ---- 常用API
    目录一、包二、String1、String概述2、String的常用方法3、String使用时的注意事项4、String的应用案例三、ArrayList1、ArrayList快速入门 1、ArrayList应用案例1、ArrayLis综合案例 前言API(ApplicationProgrammingInterface,应......
  • MongoDB :第六章:Java程序操作MongoDB
    MongoDBJava环境配置在Java程序中如果要使用MongoDB,你需要确保已经安装了Java环境及MongoDBJDBC驱动。本章节实例时候Mongo3.x以上版本。你可以参考本站的Java教程来安装Java程序。现在让我们来检测你是否安装了MongoDBJDBC驱动。首先你必须下载mongojar包,下......
  • FastJson不成想还有个版本2啊:序列化大字符串报错
    背景发现陷入了一个怪圈,写文章的话,感觉只有大bug或比较值得写的内容才会写,每次一写就是几千字,争取写得透彻一些,但这样,我也挺费时间,读者也未必有这么多时间看。我想着,日常遇到的小bug、平时工作中的一些小的心得体会,都还是可以写写,这样也才是最贴近咱们作为一线开发生活的,也不必......
  • ChatGPT 问答00021 java 对字符串进行高度压缩的算法
    Java中对字符串进行高度压缩的算法有很多种,下面我介绍两种常见的方法。Run-LengthEncoding(RLE)算法RLE算法是一种简单且高效的字符串压缩算法。它通过将连续重复的字符序列替换为一个字符和其重复次数的表示来实现压缩。示例代码如下:publicstaticStringcompressStrin......
  • Java设计思想
    KeepItSimpleandStupidKISS原则就是保持代码可读和可维护代码足够简单,也就意味着容易读懂,bug比较难隐藏。即便出现bug,修复也比较简单如何写出满足KISS原则的代码关于如何写出满足KISS原则的代码,前面已经讲了一些方法,这里总结一下。1)慎重使用过于复杂的技术来实现代码,如复......
  • Java编码技巧
    1.常量&变量1.1.直接赋值常量值,禁止声明新对象直接赋值常量值,只是创建了一个对象引用,而这个对象引用指向常量值。反例:Longi=newLong(1L);Strings=newString("abc");正例:Longi=1L;Strings="abc";1.2.当成员变量值无需改变时,尽量定义为静态常量在类的每个对象实例中,......
  • javaScript之内置对象1
    一:概述JavaScript内置对象表示Web浏览器内部支持的对象,它们提供了很多有用的功能,让使用者可以快速实现许多功能。二:说明及其举例说明数据类型:包括Number、String、Boolean、Object、Array等,这些对象提供了用于操作基本数据类型的方法。例如,使用String对象的substring()方法可以截取......
  • Java基础
    题1:什么是自动装箱?什么是自动拆箱?自动装箱是指将基本数据类型重新转化为对象。public class Test {   public static void main(String[] args) {   Integer num = 9; }  }  num = 9的值是属于基本数据类型,原则上不能直接赋值给对象Integer。但是在JDK1.5版......
  • org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan(Lorg/apache/tomcat/
    原因<dependency><groupId>org.apache.hive</groupId><artifactId>hive-jdbc</artifactId><version>3.1.3</version></dependency>解决<dependency>......
  • Java反射介绍
    反射的概述什么是反射Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射(reflecti......