Serializable接口的作用

转载 2015年07月07日 11:24:48

实现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?因为你必须显式的序列化和反序列化程序里的对象;而不是直接由一个关键词来定义一个对象是序列化的然后由系统做相应的处理。

下面是关于序列化的一个实例:

程序名称:SerializationDemo.java
程序主题:实现对象的序列化和反序列化
程序说明:该程序由实例化一个MyClass类的对象开始,该对象有三个实例变量,类型分别为String、int、double,是希望存储和恢复的信息。

代码内容

import java.io.*;

public class SerializationDemo{

          public static void main(String args[]){

//Object serialization

try{

MyClass object1=new MyClass(“Hello”,-7,2.7e10);

System.out.println(“object1:”+object1);

FileOutputStream fos=new FileOutputStream(“serial”);

ObjectOutputStream oos=new ObjectOutputStream(fos);

oos.writeObject(object1);

oos.flush();

oos.close();

}

catch(Exception e){

System.out.println(“Exception during serialization:”+e);

System.exit(0);

}

//Object deserialization

try{

MyClass object2;

FileInputStream fis=new FileInputStream(“serial”);

ObjectInputStream ois=new ObjectInputStream(fis);

object2=(MyClass)ois.readObject();

ois.close();

System.out.println(“object2:”+object2);

}

catch(Exception e){

System.out.println(“Exception during deserialization:”+e);

System.exit(0);

}

}

}

class MyClass implements Serializable{

String s;

int i;

double d;

public MyClass(String s,int i,double d){

    this.s=s;

    this.i=i;

    this.d=d;

}

public String toString(){

    return “s=”+s+”;i=”+i+”;d=”+d;

}

}

程序运行结果:object1和object2的实例变量是一样的,输出如下:
object1:s=Hello;i=-7;d=2.7E10
object2:s=Hello;i=-7;d=2.7E10

相关文章推荐

java中的Serializable接口的作用

Object serialization的定义: Object serialization 允许你将实现了Serializable接口的对象转换为字节序列,这些字节序列可以被完全存储以备以后重新生成...

java.io.Serializable接口的作用

通过实现 java.io.Serializable 接口以启用其序列化功能。 public interface Serializable { } 序列化是将对象状态转换为可保持或传输的格式的过程。与序...
  • vaecer
  • vaecer
  • 2015年03月11日 11:29
  • 777

java中的Serializable接口的作用

转载来自:http://blog.sina.com.cn/s/blog_6d3fcc7e0100vod1.html 实现java.io.Serializable 接口的类是可序列化的。没有实现此接口...

serializable接口作用以及实例展示

转载自:http://bbs.itheima.com/forum.php?mod=viewthread&tid=42338&highlight= 一个对象序列化的接口,一个类只有实现了Seriali...

javabean实现serializable接口的作用

一直都清楚JavaBean要继承Java.io.Serializable接口实现序列化,但是一直都没有深究为什么需要序列化?通过查看资料现在简单的描述如下以方便自己理解。 Serialize...

javabean规范中要求实现Serializable接口,有什么作用?

javabean规范中要求实现Serializable接口,有什么作用?

Serializable接口serialVersionUID的作用

简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。 在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类...

JavaBean (实现 Serializable(可序列化) 接口的类) 里 serialVersionUID 的作用

serialVersionUID作用:         序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 有两种生成方式:        一个是默认的1L,比如:pr...

java实现serializable接口的作用

一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializabl...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Serializable接口的作用
举报原因:
原因补充:

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