zoukankan      html  css  js  c++  java
  • Java序列化接口Serializable接口的作用总结

    转载 http://www.cnblogs.com/DreamDrive/p/4005966.html

    一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”.

    把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从硬盘中读取就可以了.(存储到硬盘是一个文件,不需要我们去解析,如果用记事本打开解析会出现乱码,解析要用特定的方式,不用我们管. 我们只需要读取).

    把对象存储到硬盘上的一个文件中,这个文件的标准扩展名是(.object).

    在很多框架中就会有这种.object结尾的文件,因为很多对象都不创建,创建起来太麻烦,直接读取,而且有些对象的值你不知道,框架封存在.object文件中,直接读取这个文件中的这个值就行了,不需要传这个值.

    复制代码
     1 import java.io.Serializable;
     2 /*
     3  * Serializable:用于给被序列化的类加入ID号。
     4  * 用于判断类和对象是否是同一个版本。 
     5  */
     6 public class Person implements Serializable/*标记接口*/ {
     7     /**
     8      * transient:非静态数据不想被序列化可以使用这个关键字修饰。 
     9      */
    10     private static final long serialVersionUID = 9527l; 
    11 //    private transient String name;
    12     private  String name;
    13 //    private static int age;
    14     private int age;
    15 
    16     public Person(String name, int age) {
    17         super();
    18         this.name = name;
    19         this.age = age;
    20     }
    21     public String getName() {
    22         return name;
    23     }
    24     public void setName(String name) {
    25         this.name = name;
    26     }
    27     public int getAge() {
    28         return age;
    29     }
    30     public void setAge(int age) {
    31         this.age = age;
    32     }
    33 }
    复制代码
    复制代码
     1 public class ObjectStreamDemo {
     2     /**
     3      * @param args
     4      * @throws IOException 
     5      * @throws ClassNotFoundException 
     6      */
     7     public static void main(String[] args) throws IOException, ClassNotFoundException {
     8         //writeObj();
     9         readObj();
    10     }
    11     public static void readObj() throws IOException, ClassNotFoundException {
    12         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.object"));
    13         //对象的反序列化。 
    14         Person p = (Person)ois.readObject();
    15         System.out.println(p.getName()+":"+p.getAge());
    16         ois.close();
    17     }
    18 
    19     public static void writeObj() throws IOException, IOException {
    20         
    21         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.object"));
    22         //对象序列化。  被序列化的对象必须实现Serializable接口。 
    23         oos.writeObject(new Person("小强",30));
    24         oos.close();
    25     }
    26 }
    复制代码

    序列号的作用:举个例子,当你一开始对这个person类进行序列化的时候用的是private类型序列化的,但是你在反序列化之前,把这个private改成了public.这样反序列化读取的时候就会报出异常.

    Exception in thread "main" java.io.InvalidClassException: cn.itcast.serializable.Person; local class incompatible: stream classdesc serialVersionUID = 9527, local class serialVersionUID = 7915096815468332737

    就是关于前后这个Person类的版本号不统一.如果加上设定一个版本号,那么经过上面的修改也是可以反序列化的.

    @throws ClassNotFoundException

    如果只有obj.object 这个文件能不能把其中的对象Person取出来,因为任何对象在堆内存中创建都必须依赖于该对象所属的类文件(class文件),如果仅仅给了obj.object,这个里面有Person对象的字节码,可是取出的时候你内存中并没有Person.class文件,没有,所以取不出来,所以必须要有obj.object文件和Person.class文件.(所以有一个ClassNotFound异常)

    类 ObjectInputStream

    ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。

    这句话的意思就是ObjectInputStream只能读取ObjectOutputStream的.

    ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。

    序列化就是按照顺序排列

    对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。(因为静态static的东西在方法区.)

    使用时候:对某些特点的对象,比如数据库连接对象,存储特定数据的对象 ,这样对象你不想创建他们,想存储起来,让他们的生命周期延长,可以把他们放在硬盘当中.每次系统启动的时候都到.object中读取对象和里面的数据,这个时候就可以把他们序列化来完成.

    仅仅是把对象从堆内存存储到了硬盘上.

    SerializableID号是根据类的特征和类的签名算出来的.为什么ID号那么长,是因为为了避免重复.所以Serializable是给类加上id用的. 用于判断类和对象是否是同一个版本。

    如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值. 原因是计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的 InvalidClassException

    在搞web开发的时候一些类就需要实现序列化接口,因为服务器就会对你的对象进行临时本地存储.它怕服务器崩了的以后,你的会话都被消失了.所以存储在了硬盘上,你重新启动服务器会恢复之前的会话,恢复对象,你之前运行的东西都在.

    //====================================================================

    具体示例可以看我的如下博文(转载+总结):

    http://www.cnblogs.com/DreamDrive/p/5412931.html

  • 相关阅读:
    QTableWidget的使用和美工总结
    pyqt下QTableWidget使用方法小结(转)
    改变QTableWidget 行高(转)
    Qt中 文件对话框QFileDialog 的使用
    Qt:拖拽图片到QLabel上并显示(转)
    Qt获取组合键(转)
    Qt图片显示效率的比较(转)
    QComboBox用法小列(转)
    TinyXML:一个优秀的C++ XML解析器(转)
    JZOJ 3099. Vigenère密码 NOIP2012
  • 原文地址:https://www.cnblogs.com/Cruyse/p/6985757.html
Copyright © 2011-2022 走看看