Java基础-JavaBean

Java基础-JavaBean

什么是JavaBean?

  • 首先,一个java bean 其实就是一个普通的java 类, 但我们对这个类有些要求:

    1. 所有属性为private
    2. 提供默认构造方法
    3. 提供getter和setter
    4. 实现serializable接口

    一个合格的JavaBean应该具备以上特点,它不是一种技术,而是一种规范。大家针对这种规范,总结了很多开发技巧、工具函数。符合这种规范的类,可以被其它的程序员或者框架使用

Serializable接口

  • 什么是 Serializable接口

    serializable接口是一个对象序列化接口,一个类只有实现了Serializable接口,它的对象才能被序列化。

  • 什么是序列化?

    序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

  • 为什么要序列化

    1. 我们都知道在Java中对象是保持在“堆”中的,堆是一个内存空间,不能长期保持,程序关闭对象就会被回收。但是有时候,我们是需要保存对象里面的信息的,这个时候就需要对对象进行持久化,对象序列化其实就是持久化。
    2. 现在微服务很流行,各个服务之间调用对象就需要把对象序列化用于在网络上传输。
    3. 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值