Java类的Serializable

建立实体类的时候需要实现serializable,之前只知道这是实现序列化,一直不是很清楚原因,今天总结一下自己的理解。
一、什么是序列化?
序列化就是将对象及其状态保存起来。简单来说序列化就是一种用来处理对象流的机制。所谓对象流也就是将对象的内容进行流化(流的概念就是I/O)。我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)!在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的!

二、为什么要序列化?
两个进程之间进行通讯时可以相互发送任何资源(数据),这些资源包括文本、图片、音视频等,这些资源在网络上传输的格式是二进制序列(字节流);
两个Java进程进行通讯时可以实现对象的传输,但是必须完成对象的序列化,也就是将对象转换为二进制序列

三、序列化的好处
⑴、序列化可以实现数据的持久化
⑵、是实现远程通讯,即在网络上以二进制字节序列的格式传送对象
⑶、保存对象的状态,方便下次取出
⑷、有了序列化可以线程间可以在网络上实现数据交互
四、实现原理
实现serializable表示该类可以序列化。序列化的目的是将一个实现了serializable接口的对象可以转换成一个字节序列,保存对象状态。将字节序列保存起来,以后可以随时将该字段恢复为原来的对象,甚至可以将该字节序列放在其他计算机上或通过网络传输到其他计算机上恢复(只要该计算机平台存在相应的类即可)。
对象实现serializable接口序列化,先要创建某些OutputStream,然后将其封装在一个ObjectOutputStream对象中,再调用writeObject()方法,即可序列化一个对象。反序列化就是调用InputStream,再调用readObject()方法(writeObject和readObject本身就是线程安全的)。
  如果某个类能够被序列化,其子类也可以被序列化,声明为static、transient类型的成员变量不可被序列化。因为static代表类的状态,transient代表对象的临时数据,static对象在反序列化的时候取得值为当前jvm中对应static变量的值,而transient(瞬态)关键字则一般用于标识那些在序列化时不需要传递的状态变量。

五、serialVersionUID
  序列化时为了保持版本的兼容性,即在升级时反序列化仍然保持对象的唯一性。有两种方式:
①、默认1L
②、根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段
  如;类getData存在硬盘上,可是后来更改了类别的field,当反序列化时就出现错误,造成不兼容问题。但是如果serialVersionUID相同时,他就会将不一样的feild以type的预设值反序列化,可避免不兼容问题。


注意:
⑴、若继承的父类未实现serializable接口,但是又想让子类可以序列化,子类实现serializable接口,子类必须有可访问的无参构造,用于保存和恢复父类的public或protected或者同包下的package字段的状态。否则在序列化或者反序列化时会抛出运行时异常,对于序列化后的子类,在进行反序列时,理论上无法初始化父类中的private对象变量的状态和值
⑵、在对可序列化类中的属性进行序列化时,如遇到不可序列化的对象变量,此时会针对不可序列化的类抛出NotSerializable异常
⑶、对于可序列化的非数组类,强烈建议显式声明static型,long型,final型。serialVersionUID字段用于标识当前序列化的版本号,否则在跨操作系统,跨编译器之间进行序列化和反序列化时容易出现InvalidClassException异常
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值