Java最新Java~序列化和反序列化为什么要实现Serializable接口,系统架构师面试

Java高频面试专题合集解析:

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

更多Java架构进阶资料展示

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

public final class String

implements java.io.Serializable, Comparable, 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 的值.

也就是说我们使用Json进行传输字符串数据的时候, JVM已经将字符串数据序列化了**

为什么要实现 Serializable 接口?


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

为什么还要指定serialVersionUID的值?


如果不显示指定 serialVersionUID, JVM 在序列化时会根据属性自动生成一个 serialVersionUID, 然后与属性一起序列化,再进行持久化或网络传输。

在反序列化时,JVM 会再根据属性自动生成一个新版 serialVersionUID,然后将这个新版 serialVersionUID 与序列化时生成的旧版 serialVersionUID 进行比较,如果相同则反序列化成功, 否则报错.

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

不指定serialVersionUID出现的问题


  1. 如果我们在不同的电脑上都有一个Person类, 我们想通过网络进行传输, 那就必须现在A电脑实现序列化, 在B电脑实现反序列化, 那么如果我们不指定serialVersionUID就就有可能反序列化失败

  2. 在实例开发过程中, 我们的类会经常改变, 如果我们使用JVM帮我们自动生成的serialVersionUID, 那么如果这个类已经有一些序列化对象, 那我们一旦修改了这个类,这些对象反序列化的时候就都会报错

写个实例测试下:

(1) User 类

不显示指定 serialVersionUID.

public class User implements Serializable {

private String name;

private Integer age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Integer getAge() {

return age;

}

public void setAge(Integer age) {

this.age = age;

}

@Override

public String toString() {

return “User{” +

“name='” + name + ‘’’ +

“, age=” + age +

‘}’;

}

}

(2) 测试类

先进行序列化, 再进行反序列化.

public class DemoSerialVersionUID {

private static void serialize(User user) throws Exception {

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(“D:\test\111.txt”)));

oos.writeObject(user);

oos.close();

}

private static User deserialize() throws Exception{

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File(“D:\test\111.txt”)));

return (User) ois.readObject();

}

public static void main(String[] args) throws Exception {

User user = new User();

user.setName(“Listen”);

user.setAge(22);

System.out.println("序列化前的结果: " + user);

serialize(user);

User dUser = deserialize();

System.out.println("反序列化后的结果: "+ dUser);

}

}

(3) 结果

先注释掉反序列化代码, 执行序列化代码, 然后 User 类新增一个属性 sex

public class User implements Serializable {

private String name;

private Integer age;

private String sex;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Integer getAge() {

最后

针对以上面试题,小编已经把面试题+答案整理好了

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

面试专题

image

除了以上面试题+答案,小编同时还整理了微服务相关的实战文档也可以分享给大家学习

image

image

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

]

[外链图片转存中…(img-BHALONLH-1715374092051)]

[外链图片转存中…(img-TQe63ooG-1715374092051)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值