聊聊Java 序列化和反序列化为什么要实现 Serializable 接口?

本文探讨了Java序列化和反序列化,解释了为何需要实现Serializable接口,以及指定serialVersionUID的原因。在Java中,序列化用于持久化对象或在网络传输中使用。当对象需要被序列化时,实现Serializable接口让JVM自动处理序列化过程。如果不指定serialVersionUID,JVM会自动生成,但在类修改后可能导致反序列化失败。因此,通常会显式指定一个不变的serialVersionUID以确保反序列化兼容性。此外,被transient和static修饰的属性不会被序列化。
摘要由CSDN通过智能技术生成

最近公司的在做服务化,需要把所有model包里的类都实现 Serializable 接口,同时还要显示指定serialVersionUID 的值。听到这个需求,我脑海里就突然出现了好几个问题,比如说:

(1) 序列化和反序列化是什么?

(2) 实现序列化和反序列化为什么要实现 Serializable 接口?

(3) 实现 Serializable 接口就算了,为什么还要显示指定 serialVersionUID 的值?

(4) 我要为 serialVersionUID 指定个什么值?

下面我们来一一解答这几个问题。

一、序列化和反序列化

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

二、什么时候需要序列化

当我们只在本地JVM里运行下Java实例,这个时候是不需要什么序列化和反序列化的,但当我们需要将内存中的对象持久化到磁盘、数据库中时,当我们需要与浏览器进行交互时,当我们需要实现RPC时,这个时候就需要序列化和反序列化了。

前两个需要用到序列化和反序列化的场景,是不是让我们有一个很大的疑问?我们在与浏览器交互时,还有将内存中的对象持久化到数据库中时,好像都没有去进行序列化和反序列化,因为我们都没有实现 Serializable 接口,但一直正常运行。

下面先给出结论

只要我们对内存中的对象进行持久化或网络传输,,这个时候都需要序列化和反序列化。

理由

服务器与浏览器交互时真的没有用到 Serializable 接口吗?JSON 格式实际上就是将一个对象转化为字符串, 所以服务器与浏览器交互时的数据格式其实是字符串, 我们来看来 String 类型的源码:

public  final  class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
     /** The value is used for character storage. */
     private  final  char value[];

     /** Cache the hash code for the string */
     private  int hash;  // Default to 0

     /** use serialVersionUID from JDK 1.0.2 for interoperability */
     private  static  final  long serialVersionUID = - 6849794470754667710L;

    ......
}

String 类型实现了 Serializable 接口,并显示指定 serialVersionUID 的值.

然后我们再来看对象持久化到数据库中时的情况,Mybatis数据库映射文件里的insert代码:

<insert id="insertUser" parameterType="org.tyshawn.bean.User">
    INSERT INTO t_user(name, age) VALUES (#{name}, #{age})
</insert>

实际上我们并不是将整个对象持久化到数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值