序列化与反序列化
文章目录
1)对Java对象进行序列化与反序列化
2)clone方法
概述
- 序列化是一种持久化的手段,为了实现在JVM停止运行之后还能够保存指定的对象,并在将来重新读取被保存的对象。
- 在保存对象时,会把其状态保存为一组字节,后面再将这些字节组装成对象,对象序列化不会关注类中的静态变量
对Java对象进行序列化与反序列化
- 在一个类中实现
java.io.Serializable
接口,那么它就可以被序列化,要求被序列化的类必须属于Enum、Array和Serializable类型中的一种。 - 通过
ObjectOutputStream
和ObjectInputStream
对对象进行序列化和反序列化 - Transient 可以使该变量不被序列化到文件中,在被序列化后,transient变量的值被设为初始值。
- ArrayList的序列化
- ArrayList底层是通过数组实现的。
- 在序列化过程中,如果被序列化的类中定义了
writeObject
和readObject
方法,则虚拟机会进行用户自定义的序列化和反序列化 - 为了防止一个包含大量空对象的数组被序列化,用transient来声明elementData。为了保证其中的元素可以被持久化下来,通过重写writeObject和readObject方法把其中的元素保留下来。
- 在使用ObjectOuptStream的writeObject方法和ObjectInputStream的readObject方法时,会通过反射的方式调用
- 序列化会通过反射调用无参数的构造方法创建一个新的对象。
- 防止序列化破坏单例模式
- 在Singleton类中自定义
readResolve
- 在Singleton类中自定义
clone方法
- 1.使用new操作符创建一个对象
- 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用(地址)发布到外部,在外部就可以使用这个引用操纵这个对象。
- 2.使用clone方法复制一个对象
- 先分配内存,分配的内存和源对象(即调用clone方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域, 填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部 。
Person p1=p
- 引用复制。同一个对象,地址相同。p和p1只是引用而已,他们都指向了一个相同的对象。
Person p1=(Person) p.clone()
- 对象复制,指向不同的对象
- 浅拷贝
- 直接将源对象中的成员变量的引用值拷贝给新对象的成员变量
- 深拷贝
- 创建一个新的相同的对象
- clone方法执行的是浅拷贝
- 通过覆盖Object中的clone方法可以实现