Java对象为啥要实现Serializable接口?

Java对象为啥要实现Serializable接口?
问在线客服
扫码问在线客服
  • 回答数

    6

  • 浏览数

    849

6个回答 默认排序
  • 默认排序
  • 按时间排序

java对象常量在栈 其他在堆 如果要传输 肯定是连续的比特流 一般的序列化特指比特流序列化 实现serializable接口 虚拟机会自动使用内置的序列化方法 当然也可以用其他的序列化框架

json序列化 xml序列化是另外一回事

取消 评论

实现这个接口可以序列化类的实例对象 将其变成一个文件存储在硬盘里 需要的时候再调用出来

取消 评论

序列化是对象实现持久化的一个过程,基本主流的开发语言都有序列化的概念,与之相反的概念是反序列化。

对比理解:

1、把java对象比喻为,通过乐高积木按照图纸搭建的一座大厦,如果要把这座大厦通过火车运到另一个地方,这时候就需要按照操作规范(接口规范)把高楼拆卸成积木块(序列化的过程),运输到目的地后,再按照图纸重新搭建出一模一样的大厦(反序列化)。

2、javascript中常用JSON.parse()和JSON.stringify(),就是一组常用的序列号和反序列化的概念。

序列化:

Java中实现Serializable接口,一般可以实现对象的序列化。目的可能有

1、持久化保存,如保存在文件或数据库等。

2、以流的形式在网络中进行传递和接收,方便沟通交流。

与之对应的是反序列化,即把流转换为对象,就可以正常的使用对象了。

总结:

java序列化主要是为了不同事物(编程对象、OS之间、网络之间等)之间进行保存、运输、沟通、交流等目的。

个人愚见,仅供参考!

取消 评论

要知道实现这个接口的原因,首先得需要了解这个接口的目的!

Serializable 接口的作用

我们先来看一下,Java API 文档对这个接口的解释:

实现了 java.io.Serializable 接口的类就表示是可序列化的,未实现此接口的类将不会将其任何状态序列化或反序列化。此接口没有方法或字段,仅用于标识可序列化的语义。

所以,这个问题就变成了,Java 对象为什么要序列化?我觉得有以下两个原因:

- 对象持久化:典型的比如 HTTP Session 对象,默认在内存中,重启后就会话就没了,为了保持会话,可以把它序列化到文件或者数据库

- 分布式对象:比如 RMI(Remote Method Invocation, 虽然已经用的不多了),调用远程主机上的服务时,可以直接使用对象作为参数,方法就像在本地使用一样

序列化和反序列化的内容是什么

序列化,就是通过 ObjectOutputStream 将对象的一部分字段值,甚至是集合字段的内容写入到一个文件中。

反序列化,就是使用 ObjectInputStream 按照之前写入的方式,从二进制文件中,读取内容,生成一个对应类的实例对象。

持续分享源码分析,造造轮子的文章和看法,欢迎关注交流 - 「顿悟源码」

取消 评论

我想先谈谈序列化和反序列化,深入浅出吧。

网络传输和持久化(简单地理解为保存起来)都是有开销的,开销越小,性能越高。那作为对象,能够通过转换格式来处理,甚至理解为压缩也行,那就大大降低开销了。所以就有了序列化。

有序列化,就有反序列化,这是成对出现的。毕竟转换了格式就得转换回来,就像加密和解密一样。

那么聊回Java,Java处理序列化就是实现Serializable接口。如果你判断该对象需要通过网络传输、存储,那么就果断实现接口吧。

噢~k。搞定!回答完毕。

以上一家之言,望采纳。欢迎关注小小枫一起交流!

取消 评论

下面我将从以下几点来介绍:

1、什么是序列化和反序列化?

2、Java对象为什么要实现Serializable接口?

3、使用Serializable接口需要注意的问题?

4、常见的序列化技术?

5、序列化技术的选型


什么是序列化和反序列化?

1、序列化

序列化就是把对象的状态信息转化为可存储或传输的形式过程,也就是把对象转化为字节序列的过程称为对象的序列化。


2、反序列化

序列化的逆向过程,把字节数组反序列化为对象,把字节序列恢复为对象的过程成为对象的反序列化。


Java对象为什么要实现Serializable接口?

对象序列化的两种用途:


(1) 对象持久化:把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;


Java 平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但是在现实应用中,就可能要求在JVM停止运行之后能够保存(序列化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。


(2) 网络传输对象:在网络上传送对象的字节序列。可以通过序列化把主机A进程上的对象序列化为二进制序列,传输到主机B上的进程从序列中重构出该对象。


还有一种情况是两个进程之间进行通信时,两方发送各种类型的数据。无论何种类型的数据,都会以二进制序列的形式在网络上进行传送。发送方需要把对象转换成字节序列,才能在网络上传送;接收方 则需要把字节序列再恢复成对象。


在java中只要一个类实现了java.io.Serializable 接口,那么它就可以被序列化。


java实现对对象序列化的方式:


JDK提供了Java对象的序列化方式,主要通过输出流 java.io.ObjectOutputStream 和 对象输入流 java.io.ObjectInputStream 来实现。其中,被序列化的对象需要 实现

java.io.Serializable

接口。


使用Serializable接口需要注意的问题?

1.serialVersionUID的作用

Java的序列化机制是通过判断类的 serialVersionUID 来验证版本一致性的。在进行反序列化时,JVM 会把传来的字节流中的 serialVersionUID与本地相应实体类的 serialVersionUID 进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是 InvalidCastException。


如果没有为指定的 class 配置 serialVersionUID,那么 java 编译器会自动给这个 class 进行一个摘要算法,类似于指纹算法,只要这个文件有任何改动,得到的 UID 就会截然不同的,可以保证在这么多类中,这个编号是唯一的


serialVersionUID有两种生成方式


(1) 默认的1L,比如:private static final long serialVersionUID = 1L;


(2) 根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段


当 实 现 java.io.Serializable 接 口 的 类 没 有 显 式 地 定 义 一 个serialVersionUID 变量时候,Java 序列化机制会根据编译的 Class 自动生成一个 serialVersionUID 作序列化版本比较用,这种情况下,如果Class 文件(类名,方法明等)没有发生变化(增加空格,换行,增加注释等等),就算再编译多次,serialVersionUID 也不会变化的。


2、静态变量序列化

序列化时并不保存静态变量,这其实比较容易理解,序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量。


3、Transient关键字

作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient变量的值设为初始值,如int型的是0.


4.、序列化的存储规则

(1) 同一个对象两次(开始写入文件到最终关闭流的这个过程算一次),如果不关闭流写入文件两次,则第二次写入对象时文件只增加5字节。

(2) Java序列化机制为了节省磁盘空间,具有特定的存储规则,当写入文件为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用,上面增加的5字节的存储空间就是新增 引用和一些控制信息的空间。反序列化时,恢复引用关系,该存储规则极大的节省了存储空间。


5、序列化实现深克隆

在java中存在一个Cloneable接口,通过实现这个接口的类都会具备clone的能力,同时clone在内存中进行,在性能方面会比我们直接通过new生成对象要高一些,特别是一些大的对象的生成,性能提升相对比较明显。


常见的序列化技术


1、java 序列化


优点:java语言本省提供,使用比较方面和简单

缺点:不支持跨语言处理、想能相对不是很好,序列化以后产生的数据相对较大


2、XML序列化

XML序列化的好处在于可读性好,方面阅读和调试。但是序列化以后的 字节码文件比较大,而且效率不高,适应于对性能不高,而且QPS较低的企业级内部系统之间的数据交换的场景,同时XML又具有语言无惯性,所以还可以用于异构系统之间的数据交换和协议。比如我们熟知的WebService,就是采用XML格式对数据进行序列化的


3、JSON序列化

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,相对于XML来说,JON的字节流较小,而且可读性也非常好。现在JSON数据格式的其他运用最普遍的。


4、Hessian 序列化框架子

Hessian是一个支持跨语言传输的二进制序列化协议,相对于Java默认的序列化机制来说,Hessian具有更好的性能和易用性,而且支持对重不同的语言,实际上Dubbo采用的就是Hessian序列化来实现,只不过Dubbo对Hessian进行重构,性能更高。


5、Protobuf 序列化框架

Protobuf是Google的一种数据交换格式,它独立于语言、独立于平台。

Google 提供了多种语言来实现,比如 Java、C、Go、Python,每一种实现都包含了相应语言的编译器和库文件Protobuf 使用比较广泛,主要是空间开销小和性能比较好,非常适合用于公司内部对性能要求高的 RPC 调用。 另外由于解析性能比较高,序列化以后数据量相对较少,所以也可以应用在对象的持久化场景中但是但是要使用 Protobuf 会相对来说麻烦些,因为他有自己的语法,有自己的编译器。


序列化技术的选型

1、技术层面

① 序列化空间开销,也就是序列化产生的结果大小,这个影响到传输的性能

② 序列化过程中消耗的时长,序列化消耗时间过长影响到业务的响应时间

③ 序列化协议是否支持跨平台,跨语言。因为现在的架构更加灵活,如果存在异构系统通信需求,那么这个是必须要考虑的

④ 可扩展性/兼容性,在实际业务开发中,系统往往需要随着需求的快速迭代来实现快速更新,这就要求我们采用的序化协议基于良好的可扩展性/兼容性,比如在现有的序列化数据结构中新增一个业务字段,不会影响到现有的服务

⑤技术的流行程度,越流行的技术意味着使用的公司多,那么很多坑都已经淌过并且得到了解决,技术解决方案也相对成熟

⑥ 学习难度和易用性

2、选型建议

① 对性能要求不高的场景,可以采用基于 XML 的 SOAP 协议

② 对性能和间接性有比较高要求的场景,那么Hessian、Protobuf、Thrift、Avro 都可以

③ 基于前后端分离,或者独立的对外的 api 服务,选用 JSON 是比较好的,对于调试、可读性都很不错

④ Avro 设计理念偏于动态类型语言,那么这类的场景使用 Avro 是可以的

取消 评论
ZOL问答 > Java对象为啥要实现Seriali...

举报

感谢您为社区的和谐贡献力量请选择举报类型

举报成功

经过核实后将会做出处理
感谢您为社区和谐做出贡献

Java对象为啥要实现Serializable接口?

点击可定位违规字符位置

扫码参与新品0元试用
晒单、顶楼豪礼等你拿

扫一扫,关注我们
提示

确定要取消此次报名,退出该活动?