java中的Serializable接口的做用

实现java.io.Serializable 接口的类是可序列化的。没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。
  序列化类的全部子类自己都是可序列化的。这个序列化接口没有任何方法和域,仅用于标识 序列化的语意。容许非序列化类的子类型序列化,子类型能够假定负责保存和恢复父类型的公有的、保护的和(若是可访问)包的域的状态。只要该类(扩展)有一 个无参构造子,可初始化它的状态,那么子类型就可承担上述职责。在这种状况下申明一个可序列化的类是一个错误。此错误将在运行时被检测。就是能够把对象存 到字节流,而后能够恢复!
  例如:Integer实现了Serializable,因此能够把一个Integer的对象用IO写到文件里,以后再能够从文件里读出,如你开始写入的时候那个对象的intValue() 是5的话,那读出来以后也是5。这一点体现了用序化类的做用,即用来传送类的对象。

  所谓的Serializable,就是java提供的通用数据保存和读取的接口。至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了。这样子,任何类型只要实现了Serializable接口,就能够被保存到文件中,或者做为数据流经过网络发送到别的地方。也能够用管道来传输到系统的其余程序中。这样子极大的简化了类的设计。只要设计一个保存一个读取功能就能解决上面说得全部问题。
java

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
相关文章
相关标签/搜索