ArrayList中字段serialVersionUID和序列化的学习

本文探讨了Java序列化中的关键概念,包括serialVersionUID的作用,它在反序列化时确保类版本一致性。文章详细解释了如何定义serialVersionUID,以及显示定义与非显示定义的区别。同时,文章还讨论了transient关键字,指出其用于阻止字段在序列化过程中被保存,以保护敏感信息。最后,通过实验验证了serialVersionUID的影响以及transient和static修饰符对序列化的影响。
摘要由CSDN通过智能技术生成

1、功能:serialVersionUID是用来验证版本一致性的字段。我们将一个类的二进制字节序列转为java对象,也就是反序列化时,JVM会把传进来的二进制字节流中的serialVersionUID和本地相应的实体或对象的serialVersionUID进行比较,如果相同,则认为两个类是一致的,可以进行反序列化,否则就会出现版本不一致的反序列化异常。



2、如何定义serialVersionUID:

(1)显示定义:为实现了Serializable的类添加private static final long 类型的字段serialVersionUID,格式如下:

class TestSeriable implements Serializable {
    private  static  final long serialVersionUID=1L;
}

(2)非显示定义:code中只写接口实现的语法定义,不写上面code中字段serialVersionUID的定义。此时java序列化机制会根据编译生的class文件中的方法和属性为该类自动生成一个serialVersionUID。只要该类的属性和方法不改变,则serialVersionUID不会改变。



3、将serialVersionUID指定为private  final static的好处:

因为非显示定义的serialVersionUID对类的方法和属性敏感,只要类中的属性or方法发生改变,则再次编译的class文件对应的serialVersionUID会与之前生成的不一致。如果之前生成的java实例已经被导入到磁盘进行了存储,那么被反序列化时,会出现InvalidCastException异常。

但是,显示定义的serialVersionUID一直不会改变,则不会出现上述异常。



4、序列化时,被声明为transient的字段不能被序列化,这样设置的原因?

首先,序列化的目的是为了传输数据,不管是从内存传到外存,还是从客户端经过网络传到服务器,目的都是为了保存信息。那么被保存的信息中有些信息是敏感的,比如银行卡密码等敏感信息,为了防止在传输过程中发生泄漏,我们就不对敏感信息进行传输,所以通过把这样的字段设置为transient,则不会再被序列化,自然也就不会被传输了。



5、被transient修饰的变量一定不能被序列化吗?

(1)answer:NO

(2)常识:java中序列化有两种方式,一种是实现Serializable接口,另一种是实现Externalizable接口,当然Externalizable继承自Serializable接口。并且由于Serializable序列化的方便性,不用自己手动去写哪些字段需要被序列化,而使用时候更多。

(3)测试:

import java.io.*;

class TestSeriable implements Externalizable {
    public transient String name;
    public  String pwd;
    public int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    //序列化对象
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(name);
        out.writeObject(pwd);
        out.writeInt(age);
    }

    //反序列化对象
    @Override
    public void readExternal(O
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值