Java基础-JavaBean
什么是JavaBean?
-
首先,一个java bean 其实就是一个普通的java 类, 但我们对这个类有些要求:
- 所有属性为private
- 提供默认构造方法
- 提供getter和setter
- 实现serializable接口
一个合格的JavaBean应该具备以上特点,它不是一种技术,而是一种规范。大家针对这种规范,总结了很多开发技巧、工具函数。符合这种规范的类,可以被其它的程序员或者框架使用
Serializable接口
-
什么是 Serializable接口
serializable接口是一个对象序列化接口,一个类只有实现了Serializable接口,它的对象才能被序列化。
-
什么是序列化?
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
-
为什么要序列化
- 我们都知道在Java中对象是保持在“堆”中的,堆是一个内存空间,不能长期保持,程序关闭对象就会被回收。但是有时候,我们是需要保存对象里面的信息的,这个时候就需要对对象进行持久化,对象序列化其实就是持久化。
- 现在微服务很流行,各个服务之间调用对象就需要把对象序列化用于在网络上传输。
- Java 对象本质上是 class 字节码,很多机器都不能根据这个字节码识别出该 Java 对象。但是序列化是序列成二进制流,二进制在计算机世界是通用的。
-
Serializable接口是如何实现序列化的
查看源码可以发现,实现的Serializable接口中并没有任何抽象方法,那它是如何实现序列化的呢?
我们查看源码注释,通过翻译后得出**“序列化接口没有任何方法活字段,仅用于标识可序列化的语义”**
我们可以理解为比如在课堂上有位学生遇到一个问题,于是举手向老师请教,这时老师帮他解答,那么这位学生的举手其实就是一个标识,自己解决不了问题请教老师帮忙解决。在Java中的这个Serializable接口其实是给jvm看的,通知jvm,我不对这个类做序列化了,你(jvm)帮我序列化就好了
-
定义serialversionUID变量
再看一下接口说明
从说明中我们可以看到,如果我们没有自己声明一个serialVersionUID变量,接口会默认生成一个serialVersionUID。但是强烈建议用户自定义一个serialVersionUID,因为默认的serialVersinUID对于class的细节非常敏感,反序列化时可能会导致InvalidClassException这个异常。
这个serialVersionUID是用来辅助对象的序列化与反序列化的,原则上序列化后的数据当中的serialVersionUID与当前类当中的serialVersionUID一致,那么该对象才能被反序列化成功。这个serialVersionUID的详细的工作机制是:在序列化的时候系统将serialVersionUID写入到序列化的文件中去,当反序列化的时候系统会先去检测文件中的serialVersionUID是否跟当前的文件的serialVersionUID是否一致,如果一直则反序列化成功,否则就说明当前类跟序列化后的类发生了变化,比如是成员变量的数量或者是类型发生了变化,那么在反序列化时就会发生crash,并且回报出错误
-
示例:JavaBean
package demo01;
import java.io.Serializable;
/**
* @Author: Lyr
* @DateTime: 2021/7/15 11:45
* @Description: User测试类
*/
public class TestUser implements Serializable {
private static final long serialVersionUID = -1590070222891052910L;
private String userName;
private String sex;
public TestUser(){
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
private String age;
}