java中的Serializable接口的作用

原创 2018年04月16日 16:29:56

什么是Serializable接口?
一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化

什么是序列化?
将对象的状态信息转换为可以存储或传输的形式的过程,在序列化期间,对象将其当前状态写入到临时存储区或持久性存储区,之后,便可以通过从存储区中读取或反序列化对象的状态信息,来重新创建该对象

什么情况下需要序列化?
当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化

Serializable主要用来支持两种主要的特性:
1、Java的RMI(remote method invocation),RMI允许像在本机上一样操作远程机器上的对象,当发送消息给远程对象时,就需要用到序列化机制来发送参数和接受返回值
2、Java的JavaBean,Bean的状态信息通常是在设计时配置的,Bean的状态信息必须被保存下来,以便当程序运行时能恢复这些状态信息,这也需要序Serializable机制

实现java.io.Serializable 接口的类是可序列化的。没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。

  序列化类的所有子类本身都是可序列化的。这个序列化接口没有任何方法和域,仅用于标识序列化的语意。允许非序列化类的子类型序列化,子类型可以假定负责保存和恢复父类型的公有的、保护的和(如果可访问)包的域的状态。只要该类(扩展)有一个无参构造子,可初始化它的状态,那么子类型就可承担上述职责。在这种情况下申明一个可序列化的类是一个错误。此错误将在运行时被检测。就是可以把对象存到字节流,然后可以恢复!

  例如:Integer实现了Serializable,所以可以把一个Integer的对象用IO写到文件里,之后再可以从文件里读出,如你开始写入的时候那个对象的intValue() 是5的话,那读出来之后也是5。这一点体现了用序化类的作用,即用来传送类的对象。 所谓的Serializable,就是java提供的通用数据保存和读取的接口。至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了。这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。这样子极大的简化了类的设计。只要设计一个保存一个读取功能就能解决上面说得所有问题。

Object serialization的定义: Object serialization 允许你将实现了Serializable接口的对象转换为字节序列,这些字节序列可以被完全存储以备以后重新生成原来的对象。 serialization不但可以在本机做,而且可以经由网络操作(RMI)。这个好处是很大的----因为它自动屏蔽了操作系统的差异,字节顺序(用Unix下的c开发过网络编程的人应该知道这个概念)等。比如,在Window平台生成一个对象并序列化之,然后通过网络传到一台Unix机器上,然后可以在这台Unix机器上正确地重构这个对象。
Object serialization主要用来支持2种主要的特性: 1。Java的RMI(remote method invocation).RMI允许象在本机上一样操作远程机器上的对象。当发送消息给远程对象时,就需要用到serializaiton机制来发送参数和接收返回直。
2。Java的JavaBeans. Bean的状态信息通常是在设计时配置的。Bean的状态信息必须被存起来,以便当程序运行时能恢复这些状态信息。这也需要serializaiton机制。

二。sakulagi和rollingpig说的持久化我也说一下。 我觉得你们说的应该是英文里的persistence.但是Java语言里现在只支持lightweight persistence,就是轻量级持久化,这是通过serialization机制来实现的。
persistence是指一个对象的生命周期不由程序是否执行来决定,即使是在程序终止时这个对象也存在。它把一个serializable的对象写到磁盘(本机或其他机器上的非RAM存储器),并在程序重新调用时再读取对象到通常的RAM存储器。
为什么说Java的serialization机制实现的是lightweight persistence?因为你必须显式的序列化和反序列化程序里的对象;而不是直接由一个关键词来定义一个对象是序列化的然后由系统做相应的处理。

如下例子:

package com.hoobey.estore.domain;

import java.io.Serializable; import java.util.Date; import java.util.List;

public class Order implements Serializable {

 private String id;

 private double money;

 private String receiverinfo;

 private int paystate;

 private Date orderTime;

 private int user_id;

 // 用于订单查询时,可以将用户信息也封装到Order中  private String username;  private String nickname;

 // 订单中包含多个订单项  private List<OrderItem> orderItems;

 public String getId() {   return id;  }

 public void setId(String id) {   this.id = id;  }

 public double getMoney() {   return money;  }

 public void setMoney(double money) {   this.money = money;  }

 public String getReceiverinfo() {   return receiverinfo;  }

 public void setReceiverinfo(String receiverinfo) {   this.receiverinfo = receiverinfo;  }

 public int getPaystate() {   return paystate;  }

 public void setPaystate(int paystate) {   this.paystate = paystate;  }

 public Date getOrderTime() {   return orderTime;  }

 public void setOrderTime(Date orderTime) {   this.orderTime = orderTime;  }

 public int getUser_id() {   return user_id;  }

 public void setUser_id(int user_id) {   this.user_id = user_id;  }

 public List<OrderItem> getOrderItems() {   return orderItems;  }

 public void setOrderItems(List<OrderItem> orderItems) {   this.orderItems = orderItems;  }

 public String getUsername() {   return username;  }

 public void setUsername(String username) {   this.username = username;  }

 public String getNickname() {   return nickname;  }

 public void setNickname(String nickname) {   this.nickname = nickname;  }

}

Java核心技术 第一章 接口、继承与多态

课程主要包含: 第一讲 类的继承 第二讲 Object类 第三讲 对象类型的转换 第四讲 方法的重载 第五讲 方法的重写 第六讲 多态 第七讲 抽象类和接口
  • 2017年05月02日 11:37

某些java类为什么要实现Serializable接口

什么是Serializable接口? 一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化 什么是序列化? 将对象的状态信息转换为可以存储或传输的形式的过程,...
  • summer_sy
  • summer_sy
  • 2017-04-20 10:13:16
  • 8702

浅谈Java的标识接口-Serializable

为什么java中有些interface没有任何方法? 在Java语言中,有些接口内部没有声明任何方法,也就是说实现这些接口的类不需要重写任何方法,这些没有任何方法声明的接口又被叫做标识接口,标识...
  • lucia_fanchen
  • lucia_fanchen
  • 2015-10-29 08:58:31
  • 6774

接口java.io.Serializable的用处 (全面搜集总结)

  1、java.io.Serializable,表示序列化,是一个空接口,也就是说这个接口没有声明任何的方法,所以实现这个接口的类也就不需要实现任何的方法。        2、序列化   用在将对象...
  • chenjie19891104
  • chenjie19891104
  • 2009-07-31 22:54:00
  • 14535

简述serializable和transient关键字作用

一、序列化使用场景 对象的序列化:目的:将一个具体的对象进行持久化,写入到硬盘上。(注意:静态数据不能被序列化,因为静态数据不在堆内存中,而是在静态方法区中) Serializable:用于启动对象...
  • java__project
  • java__project
  • 2017-02-10 01:17:53
  • 1058

Java中 Cloneable 、Serializable 接口详解

Cloneable接口clone:它允许在堆中克隆出一块和原对象一样的对象,并将这个对象的地址赋予新的引用。 Java 中 一个类要实现clone功能 必须实现 Cloneable接口,否则在调用 ...
  • xiaomingdetianxia
  • xiaomingdetianxia
  • 2017-07-05 16:08:35
  • 2678

java类实现serializable有什么好处或意义

一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializabl...
  • jaryle
  • jaryle
  • 2016-09-20 17:41:11
  • 2373

为什么要实现serializable接口作用

序列化,就是把对象转化为字节流,才能进行网络传输。 把该字节序列保存起来(例如:保存在一个文件里),以后可以随时将该字节序列恢复为原来的对象。甚至可以将该字节序列放到其他计算机上或者通过网络传输到其...
  • xiyangyang8110
  • xiyangyang8110
  • 2016-11-10 16:12:29
  • 1034

实体类实现Serializable的作用

Serializable,之前一直有使用,默认的实体类就会实现Serializable接口,对具体原因一直不是很了解,同时如果没有实现序列化,同样没什么影响,什么时候应该进行序列化操作呢?今天查了下资...
  • dreamer_8399
  • dreamer_8399
  • 2017-07-26 15:28:25
  • 1824

面试题:Java中对象序列化接口(Serializable)的意义

Serializable接口是一个里面什么都没有的接口 它的源代码是public interface Serializable{},即什么都没有。 如果一个接口里面什么内容都没有,那么这个接口是一...
  • u012110719
  • u012110719
  • 2015-06-07 22:02:04
  • 2362
收藏助手
不良信息举报
您举报文章:java中的Serializable接口的作用
举报原因:
原因补充:

(最多只允许输入30个字)