JAVA基础 - Serializable的作用与用法

作用是什么?

Serializable是java.io包中定义的,用于将JAVA对象进行序列化和反序列化。序列化,将一个JAVA对象以二进制流的方式持久化到数据库、文件中,或者用于大对象暂存、网络传输、使用序列化实现深度克隆;反序列化,将之前持久化在数据库或文件中的二进制数据,以流的方式读取出来重新构造成一个和之前内容相同的JAVA对象。Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。
一个对象实现了Serializable接口,则所有信息(不包括被static、transient修饰的变量信息)的序列化将自动进行。

serialVersionUID的作用是什么?

默认情况下,serialVersionUID是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段。对象在反序列化时,如果serialVersionUID值不同,则会抛出InvalidClassException的异常,则反序列化失败。

serialVersionUID如何定义?

有两种方法来定义serialVersionUID,无论采用哪种方法,只要其对象在序列化与反序列化过程中保持不变即可。
A. 一种是private static final long serialVersionUID = 1L;
B. 一种根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,如:private static final long serialVersionUID = -8940196742313994740L;(可以使用IDEA来生成serialVersionUID)。
在这里插入图片描述

静态变量的序列化

静态变量不会被序列化,静态成员变量是属于类级别的,而序列化是针对对象的,所以不能被序列化。

Transient 关键字作用(当实现Serializable接口)

Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
Transient 关键字只能修饰变量,而不能修饰方法和类,如果一个变量是类变量,则该类也实现Serializable接口。

对象序列化的方法

A. 实现Serializable接口,则所有信息(不包括被static、transient修饰的变量信息)的序列化将自动进行。
B. 实现Externalizable接口,则不会进行自动序列化,需要开发者在writeExternal()方法中手工指定需要序列化的变量,这时与是否被transient修饰就无关了。

注意事项

序列化对象必须实现序列化接口Serializable。
序列化对象中的属性如果被对象修饰的话,其对象需要实现序列化接口。
类的对象序列化后,类的序列号不能轻易更改,否则反序列化会失败。
类的对象序列化后,类的属性增加或删除不会影响序列化,只是值会丢失。
如果父类序列化,子类会继承父类的序列化;如果父类没序列化子类序列化了,子类中的属性能正常序列化,但父类的属性会丢失,不能序列化。
用JAVA序列化的二进制字节数据只能由JAVA反序列化,如果要转换成其他语言反序列化,则需要先转换成Json/XML通用格式的数据。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中的Serializable接口是一个标记接口,用于表示一个类的实例可以被序列化和反序列化。 当一个类实现了Serializable接口时,意味着它的对象可以被转换为一系列的字节,可以在网络上传输,或者可以被保存在硬盘上。而反序列化则是将这些字节转换为对象。 Serializable接口的作用主要有以下几个方面: 1. 网络传输:通过将对象序列化成字节流进行网络传输,可以在分布式系统中方便地传递对象信息。 2. 对象持久化:将对象序列化后,可以保存在数据库、文件系统或内存中,以实现数据的持久化。 3. RMI(远程方法调用):远程方法调用中,对象需要通过网络传输,通过实现Serializable接口,可以方便地进行远程对象的传输和调用。 需要注意的是,对于一个类的对象,如果需要被序列化,该类必须实现Serializable接口,否则会抛出NotSerializableException异常。同时,该类的属性如果是引用类型,也需要保证其所属的类都实现了Serializable接口,否则也无法被序列化。 为了实现对象的序列化,需要使用ObjectOutputStream将对象转换为字节流,并用ObjectInputStream将字节流转换为对象。在序列化的过程中,可以通过使用transient关键字标记某些属性,使得这些属性在序列化过程中被忽略。 总之,Serializable接口的使用使得在Java中可以轻松地实现对象的序列化和反序列化,方便了对象在不同环境中的传输和存储。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值