java序列化反序列化

代码参考

https://github.com/eos2009/java-core-learn.git

概念

序列化和反序列化属于通信协议的一部分。 序列化:将对象(java)转换成二进制串的过程。反序列化:将在序列化过程中所生成的二进制串转换成者对象(java)的过程

序列化

java序列化需要实现Serializable,否则或抛出异常

在这里插入图片描述

serialVersionUID

  • 建议序列化类设置private static final long serialVersionUID = 1L;
  • 序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。可序列化类可以通过声明名为“serialVersionUID” 的字段(该字段必须常量)显式声明;
  • 如果可序列化类未显式声明 serialVersionUID,jvm会根据这个类调用一个运算过程生成一个serialVersionUID,这个自动生成的值将会受到类名、实现的接口名称、以及所有的公有方法和受保护的成员名称所影响

序列化注意点

  • transient修饰属性不会序列化
    在这里插入图片描述
  • 静态属性不会序列化(序列化的是对象实例的成员变量,静态变量常量属于类属性)
    在这里插入图片描述
  • 父类没有实现序列化接口不会被序列化,反序列化时会调用分类的空构造方法
    在这里插入图片描述
  • 父类实现了序列化接口,子类默认继承序列化接口,序列化子类时父类会序列化
    在这里插入图片描述

可能问题

兼容问题
	如添加新属性后,老的序列化文件反序列化问题
	可以指定private static final long serialVersionUID = 1L;
安全问题
	如序列化会把业务数据完全存储到二进制流中,并且该过程完全可逆的
	可以对敏感信息加密处理等

参考

https://www.runoob.com/java/java-serialization.html
https://www.jianshu.com/p/52b754c2175b
https://blog.csdn.net/u013870094/article/details/82765907

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值