Java的序列化和反序列化

From:https://blog.csdn.net/qq_27093465/article/details/78544505

https://www.liaoxuefeng.com/wiki/1252599548343744/1298366845681698

1. 为什么要序列化和反序列化

这个很简单,为了保存和传输Object

2. 怎么实现序列化和反序列化

让对象继承Serializable接口。类似Serializable这样的空接口被称为“标记接口”

注意:

  • transient修饰的变量不序列化和反序列化。反序列化出来的对象的这个变量是null。
  • static变量不会被序列化。反序列化出来的对象对应的字段初始化的时候是什么值他就是什么值。
  • 反序列化时,由JVM直接构造出Java对象,不调用构造方法,构造方法内部的代码,在反序列化时根本不可能执行。

3. serialVersionUID的作用

其实它就是要给版本号的概念。对象的成员变量修改了这个版本号就应该变。

我们经常能看到,在要被序列化的对象里会加上serialVersionUID。其实不加也可以,java编译器会根据你的这个对象的属性自动生成一个serialVersionUID

private static final long serialVersionUID = 1L;

但是建议最好还是加上。为什么呢?因为不同的编译器有可能生成serialVersionUID的方式不一样。导致你序列化时serialVersionUID是123456L,反序列化时其他的java编译器生成的serialVersionUID是64789L。这样反序列化时serialVersionUID对不上就会报InvalidClassException异常

4. 总结:

  • 因为Java的序列化机制可以导致一个实例能直接从byte[]数组创建,而不经过构造方法,因此,它存在一定的安全隐患。一个精心构造的byte[]数组被反序列化后可以执行特定的Java代码,从而导致严重的安全漏洞

  • 实际上,Java本身提供的基于对象的序列化和反序列化机制既存在安全性问题,也存在兼容性问题。更好的序列化方法是通过JSON这样的通用数据结构来实现,只输出基本类型(包括String)的内容,而不存储任何与代码相关的信息

  • Java的序列化机制仅适用于Java,如果需要与其它语言交换数据,必须使用通用的序列化方法,例如JSON。

你可能感兴趣的:(Java的序列化和反序列化)