Java序列化和反序列化

java基础

一、序列化和反序列化的定义和场景

序列化:将对象写入到IO流中

反序列化:从IO流中恢复对象

序列化机制将实现序列化的Java对象转化为字节数组序列。可以使对象可以脱离程序而独立运行

场景和要求:保存到磁盘;在网络中传输。要保存到磁盘和在远程传输的java对象要求都必须是可序列化的。

1775767-20190919183814958-834142409.png

二、序列化和反序列化的java实现

Serializable接口

一个标记接口,不用实现任何方法。一旦实现了此接口,该类的对象就是可序列化的。

序列化步骤

1 创建ObjectOutputStream输出流;2 调用ObjectOutputStream对象的writeObject输出可序列化对象。

若对象不是序列化对象,序列化是将抛出 NotSerializableException 异常

反序列化步骤

1 创建ObjectInputStream输入流;2 调用ObjectInputStream对象的readObject()得到可序列化对象

demo:

public class People implements Serializable {
    private String name;
    private String city;
  
    public void setCity(String city) {
        this.city = city;
    }
    public void setName(String name) {
        this.name = name;
    }
    public static void main(String[] args) {
        People people = new People();
        people.setCity("成都");
        people.setName("假老练");
        People people1 = new People();
        people1.setCity("北京");
        people1.setName("风车车");
        try {
            FileOutputStream fileOutputStream = new FileOutputStream("object.txt");
            ObjectOutputStream os = new ObjectOutputStream(fileOutputStream);
            os.writeObject(people);
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            FileInputStream fileInputStream = new FileInputStream("object.txt");
            ObjectInputStream os = new ObjectInputStream(fileInputStream);
            People peopleResult = (People) os.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如果需要序列化的类的属性含有非基本数据类型和String类型,即引用类型,那么该引用类型也比如可序列化。否则依然会抛出 NotSerializableException 异常

serialVersionUID的作用

Java 的序列化,通过在运行时判断类的serialVersionUID来验证版本一致性。

在进行反序列化时,JVM 会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。实测如果id一致,属性发生较小变化,对象也会创建出来,并将属性按属性名对号入座。

当实现序列化的时候,建议显式定义serialVersionUID,若不显式定义 serialVersionUID 的值,Java 会根据类细节自动生成 serialVersionUID 的值。可能造成以下两个问题。1.如果对类的源代码作了修改,再重新编译,新生成的类文件的serialVersionUID的取值有可能也会发生变化。2.类的serialVersionUID的默认值完全依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,也有可能会导致不同的serialVersionUID,即不同机器或不同版本jdk反序列化可能失败。

总计

  1. 序列化是将对象写入到IO字节流,反序列化是从IO字节流中恢复对象
  2. 序列化的两个主要作用是用来存储和网络传输

转载于:https://www.cnblogs.com/valjeanshaw/p/11480961.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值