代码参考
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