代码改变世界

[转]serializable接口说明-java

2012-09-13 21:59  Ball Cactus  阅读(209)  评论(0编辑  收藏  举报
转自:http://www.cnblogs.com/blognetspace/articles/1576684.htm
serializable接口说明-java

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

 

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class MyClass implements Serializable{
    //private static final long serialVersionUID = 1L;
    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;
    }
}
//SerializationDemo
public class test1{
    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("c:\\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("c:\\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);
        }
    }
}

 

程序运行结果:object1和object2的实例变量是一样的,输出如下:
object1:s=Hello;i=-7;d=2.7E10
object2:s=Hello;i=-7;d=2.7E10
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机制。
Java语言里现在只支持lightweight persistence,就是轻量级持久化,这是通过serialization机制来实现的。
persistence是指一个对象的生命周期不由程序是否执行来决定,即使是在程序终止时这个对象也存在。它把一个serializable的对象写到磁盘(本机或其他机器上的非RAM存储器),并在程序重新调用时再读取对象到通常的RAM存储器。
为什么说Java的serialization机制实现的是lightweight persistence?因为你必须显式的序列化和反序列化程序里的对象;而不是直接由一个关键词来定义一个对象是序列化的然后由系统做相应的处理。  如果以后的Java版本出现一个新的关键字来实现这种机制,比如就是persistence,如果我用
persistence  (String s="chinaunix")
然后系统自动处理上面程序实现,那么Java就实现了persistence.