`
xiebh
  • 浏览: 603305 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

我对Java Serializable(序列化)的理解和总结

阅读更多
1、序列化是干什么的?
       简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

2、什么情况下需要序列化  
    a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
    b)当你想用套接字在网络上传送对象的时候;
    c)当你想通过RMI传输对象的时候;

3、当对一个对象实现序列化时,究竟发生了什么?
    在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变量(instance ariable)比如:
   
java 代码
  1. Foo  myFoo = new Foo();  
  2. myFoo .setWidth(37);  
  3. myFoo.setHeight(70);  
     
       当 通过下面的代码序列化之后,MyFoo对象中的width和Height实例变量的值(37,70)都被保存到foo.ser文件中,这样以后又可以把它 从文件中读出来,重新在堆中创建原来的对象。当然保存时候不仅仅是保存对象的实例变量的值,JVM还要保存一些小量信息,比如类的类型等以便恢复原来的对 象。
java 代码
  1. FileOutputStream fs = new FileOutputStream("foo.ser");  
  2. ObjectOutputStream os = new ObjectOutputStream(fs);  
  3. os.writeObject(myFoo);  

4、实现序列化(保存到一个文件)的步骤
      
a)Make a FileOutputStream            
java 代码
  1. FileOutputStream fs = new FileOutputStream("foo.ser");    
       b)Make a ObjectOutputStream           
java 代码
  1. ObjectOutputStream os =  new ObjectOutputStream(fs);   
       c)write the object
java 代码
  1. os.writeObject(myObject1);  
  2. os.writeObject(myObject2);  
  3. os.writeObject(myObject3);  
    d) close the ObjectOutputStream
java 代码
  1. os.close();  


5、举例说明
java 代码
  1. import java.io.*;
  2.   
  3. public class  Box implements Serializable  
  4. {  
  5.     private int width;  
  6.     private int height;  
  7.   
  8.     public void setWidth(int width){  
  9.         this.width  = width;  
  10.     }  
  11.     public void setHeight(int height){  
  12.         this.height = height;  
  13.     }  
  14.   
  15.     public static void main(String[] args){  
  16.         Box myBox = new Box();  
  17.         myBox.setWidth(50);  
  18.         myBox.setHeight(30);  
  19.   
  20.         try{  
  21.             FileOutputStream fs = new FileOutputStream("foo.ser");  
  22.             ObjectOutputStream os =  new ObjectOutputStream(fs);  
  23.             os.writeObject(myBox);  
  24.             os.close();  
  25.         }catch(Exception ex){  
  26.             ex.printStackTrace();  
  27.         }  
  28.     }  
  29.       


6、相关注意事项
    a)序列化时,只对对象的状态进行保存,而不管对象的方法;
    b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
    c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
    d)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:
        1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输  等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
       2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分  配,而且,也是没有必要这样实现。
分享到:
评论
15 楼 OnTheRoad_lee 2014-06-20  
不错,正式我想要的东西,一直不明白序列化是什么?有什么用?至此终于可以告一段落了
14 楼 yong7356 2013-11-11  
学习一下Serializable
13 楼 dengjm_2012 2012-05-17  
写得不错!
12 楼 andy54321 2008-08-04  
thank for sharing
11 楼 zhoujj303030 2008-08-03  
还是挺详细的,多多学习!
10 楼 aninfeel 2008-06-16  
再加一条我的经验,servlet和applet交互时用系列化对象传输很不错,担心编码的话可以用base64。
9 楼 Chihom 2008-06-15  
谢谢楼主。
8 楼 whshuaish 2007-10-26  
好象听懂了....以前只是看到别个用过...不晓得该怎样使用的..谢谢了
7 楼 qingyuan914 2007-09-10  
我也提一点,序列化就是要保存对象此时的状态,也就是state,目的就是为了以后要用到此时状态的对象,又怎样把序列化的对象回复内存中呢。给几个方法:1从文件中这么获得;2从网络的上怎么获得;3用RMI怎么获得?
6 楼 xiebh 2007-09-10  
总结可以使别人的知识变成自己的东西,可以使知识更清晰
5 楼 hlxiong 2007-09-10  
边学习边总结是一个非常不错的方法,这样你学的知识基本都会运用了。
记得我刚开始学java的时候,只会只照着例子copy,然后傻呵呵等着早就知道结果的答案,巨笨。
4 楼 xiebh 2007-09-09  
我也看了transient这方面的资料,可能由于时间关系,没有进行总结,我会继续努力
3 楼 dennis_zane 2007-09-09  
没有超过TIJ的讨论,况且也没有谈论到transient关键字
2 楼 sharong 2007-09-07  
嗯,这个是java最基本的设计思想,javaer必须理解这个思想,里面有一点点装箱和拆箱的概念在里面
1 楼 zzysh 2007-09-07  
不错。有学习了点core java的知识

相关推荐

    Java_Serializable(序列化)的理解和总结

    Java_Serializable(序列化) 的理解和总结

    Java中的序列化与反序列化.pdf

    Serializable接口和Externalizable接口实现序列化和反序列化

    基于Java的XML解析与反射设计模式.doc

    使用xstream序列化的类不需要实现serializable接口。xstream是一种序列 化工具而不是数据绑定工具,就是说不能从xml或者xml schema definition (xsd)文件生成类。 和其他序列化工具相比,xstream 有三个突出的特点...

    Java面试宝典2010版

    74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载class文件的原理机制? 52 76、heap和stack有什么区别。 52 77、GC是什么? 为什么要有GC? 52 78、垃圾回收的...

    Java面试宝典-经典

    74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载class文件的原理机制? 52 76、heap和stack有什么区别。 52 77、GC是什么? 为什么要有GC? 52 78、垃圾回收的...

    java面试题大全(2012版)

    74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载class文件的原理机制? 52 76、heap和stack有什么区别。 52 77、GC是什么? 为什么要有GC? 52 78、垃圾回收的...

    最新Java面试宝典pdf版

    74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载class文件的原理机制? 52 76、heap和stack有什么区别。 52 77、GC是什么? 为什么要有GC? 52 78、垃圾回收的...

    Java面试笔试资料大全

    74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载class文件的原理机制? 52 76、heap和stack有什么区别。 52 77、GC是什么? 为什么要有GC? 52 78、垃圾回收的...

    java面试宝典2012

    74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 56 75、描述一下JVM加载class文件的原理机制? 56 76、heap和stack有什么区别。 57 77、GC是什么? 为什么要有GC? 57 78、垃圾回收的...

    JAVA面试宝典2010

    74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载class文件的原理机制? 52 76、heap和stack有什么区别。 52 77、GC是什么? 为什么要有GC? 52 78、垃圾回收的...

    Java面试宝典2012新版

    74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载class文件的原理机制? 52 76、heap和stack有什么区别。 52 77、GC是什么? 为什么要有GC? 52 78、垃圾回收的...

    Java面试宝典2012版

    74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载class文件的原理机制? 52 76、heap和stack有什么区别。 52 77、GC是什么? 为什么要有GC? 52 78、垃圾...

    安卓java读取网页源码-AndroidLearningNotes:第一次提交

    序列化的方式 Serializable 和Parcelable 的区别 静态属性和静态方法是否可以被继承?是否可以被重写?以及原因? 静态内部类的设计意图 成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用 ...

    java 混淆工具,不可逆 jocky 也许是最好的了

    事实上,即便不加@preserve指令,Jocky对Java语言特有的一些private级别的方法不进行混淆,譬如,在序列化时有特殊作用的writeObject及readObject方法等。但笔者强烈建议: 针对这些有特殊含义不能够被混淆的 ...

    leetcode下载-Note:我的笔记

    序列化,Serializable在序列化时使用了反射,从而导致GC的频繁调用。 可见性,原子性,有序性 可见性volatile,一个线程的修改对另外一个线程是马上可见的。 原子性CAS操作,要么都做要么都不做 有序性synchronized...

    Java 面试宝典

    一. Java 基础部分............................................................................................................43、Java 中的异常处理机制的简单原理和应用。 .....................................

Global site tag (gtag.js) - Google Analytics