Java 序列化和反序列化

什么是序列化和反序列化

  • 序列化:(将对象转换成字节流的形式)将java对象以一连串的字节保存在磁盘文件中的过程,也可以说是保存java对象状态的过程。序列化可以将数据永久保存在磁盘上(通常保存在文件中)。
  • 反序列化:将保存在磁盘文件中的java字节码重新转换成java对象称为反序列化(将字节流转化成内存中的对象)

如何实现序列化和反序列化

序列化
首先,被序列化的类要实现 Serializable 接口,然后该类型的对象都可以被序列化了
		//对象实例化
        Person person1 = new Person("小花","女",18);
        //将对象转换成字节流的格式输出出去
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person1"));
        oos.writeObject(person1);
        //关闭资源
        oos.close();

当程序运行完之后,我们发现程序文件中多了一个person1的文件
在这里插入图片描述
打开后发现里面全是乱码,这是因为程序把person1对象序列化成字节保存下来了
在这里插入图片描述
我们可以通过反序列化去读取它

反序列化
		ObjectInputStream ooi = new ObjectInputStream(new FileInputStream("person1"));
        person pe = (person) ooi.readObject();
        System.out.println(pe.getName());//person{name='小花', sex='女', age=18}
        ooi.close();

不被序列化

那么,如果开发过程中,有一些属性不想被序列化出去我们怎么避免序列化呢,那些内容是不会被序列化出去的呢?

不能被序列化的内容有以下几个方面。
一、有static修饰的属性。
二、有transient修饰的属性。
三、成员方法。

还是以上边的person为例,我们将其name属性用transient修饰,结果当我们再运行程序的时候报异常了,这是为什么呢
在这里插入图片描述

serialVersionUID

这是因为JAVA序列化的机制是通过判断类的serialVersionUID来验证的版本一致的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID于本地相应实体类的serialVersionUID进行比较。如果相同说明是一致的,可以进行反序列化,否则会出现反序列化版本一致的异常,InvalidCastException。

因为随着文件的修改,它的serialVersionUID也会随之改变,这就是为什么刚刚可以,现在不可了,其实就是找不到家门了。

所有我们要在想要序列化的类中加入serialVersionUID 字段,防止其因为二次修改而反序列化异常

  private static final long serialVersionUID = 1L;

我们加上以上代码后,成功的读出了name为null的person对象

person{name='null', sex='女', age=18}

优点

    一、以某种存储形式使自定义对象持久化。
    二、序列化对象信息完整,保证其完整性。
    三、将对象从一个地方传递到另一个地方,可传递性。
    四、使程序更具维护性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值