Java基础 序列化

Java序列化就是将一个对象转化为一个二进制表示的字节数组,通过保存或则转移这些二进制数组达到持久化的目的。要实现序列化,需要实现java.io.Serializable接口。反序列化是和序列化相反的过程,就是把二进制数转化为对象的过程。在反序列化的时候,必须有原始类的模板才能将对象还原。

        当父类实现了Serializable接口的时候,所有的子类都序列化

        子类实现了Serializable接口,父类没有,父类中的属性不能被序列化(不报错)

        如果序列化的属性是对象,对象必须也能序列化,否则会报错

        反序列化的时候serialVersionUID被修改的话,会反序列化失败。

        在存Java环境下使用Java的序列化机制会支持的很好,但是在多语言环境下需要考虑别的序列化机制,比如xml、json或protobuf等

serialVersionUID值是用于确保类序列化与反序列化的兼容性问题的,如果序列化过程中这两个值不一样,那么将导致序列化失败。

        可以看到编译器推荐两种方式,一种是生成默认的versionID,这个值为1L,还有一种方式是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,只要类名、方法名、变量有修改或者有空格、注释、换行等操作,计算出来的哈希字段都会不同,当然这里需要注意,每次有以上的操作的时候 尽量都要重新生成一次serialVerionUID,编译器并不会自动修改

        Java序列化只是针对对象的属性的传递,至于方法和序列化过程无关。

        当一个父类实现了序列化,那么子类自动实现序列化,不需要显示序列化接口,反过来,子类实现序列化,而父类没有序列化会失败--即序列化具有传递性

        当一个对象的实例变量引起用了其他对象,序列化这个对象的时候会自动把引用的对象也进行序列化

        当某个字段被申明为transient 后,默认的序列化机制会忽略这个字段;

        被申明为transient的字段,如果需要序列化,可以添加两个私有方法writeObject和readObject或者实现Externalizable接口

对象克隆

在Java中所有的类都是缺省的继承自Java语言包中的Object类的,查看它的源码

克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当 需要一个新的对象来保存当前对象的状态就靠clone方法。那么把这个对象的临时属性一个一个的赋值给 新new的对象不也行嘛?可以是可以,但是一来麻烦不说,通过上面的源码都发现了clone是一个native 方法,在底层实现的。

浅克隆

1. 被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出 CloneNotSupportedException异常), 该接口为标记接口,不含任何方法

2. 覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象。 native为本地方法

在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是 引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相 同的内存地址。

简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的 成员对象并没有复制。

深克隆

在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原 型对象的所有引用对象也复制一份给克隆对象。

简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制。

在Java语言中,如果需要实现深克隆,可以通过覆盖Object类的clone()方法实现,也可以通过序列化 Serialization等方式来实现。一般使用序列化的方式实现

序列化就是将对象写到流的过程,写到流中的对象是原有对象的一个拷贝,而原对象仍然存在于内存 中。通过序列化实现的拷贝不仅可以复制对象本身,而且可以复制其引用的成员对象,因此通过序列化 将对象写到一个流中,再从流里将其读出来,可以实现深克隆。需要注意的是能够实现序列化的对象其 类必须实现Serializable接口,否则无法实现序列化操作。

原型模式

原型模式Prototype Pattern是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建 型模式,它提供了一种创建对象的最佳方式。

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时, 则采用这种模式

意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

优点:1、性能提高。 2、逃避构造函数的约束。

缺点:1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一 定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。 2、必须实现 Cloneable接口。

注意:与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对 象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值