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

  • 相关阅读:
    DRUPAL-PSA-CORE-2014-005 && CVE-2014-3704 Drupal 7.31 SQL Injection Vulnerability /includes/database/database.inc Analysis
    WDCP(WDlinux Control Panel) mysql/add_user.php、mysql/add_db.php Authentication Loss
    Penetration Testing、Security Testing、Automation Testing
    Tomcat Server Configuration Automation Reinforcement
    Xcon2014 && Geekpwn2014
    phpMyadmin /scripts/setup.php Remote Code Injection && Execution CVE-2009-1151
    Linux System Log Collection、Log Integration、Log Analysis System Building Learning
    The Linux Process Principle,NameSpace, PID、TID、PGID、PPID、SID、TID、TTY
    Windows Management Instrumentation WMI Security Technology Learning
    IIS FTP Server Anonymous Writeable Reinforcement, WEBDAV Anonymous Writeable Reinforcement(undone)
  • 原文地址:https://www.cnblogs.com/Cruyse/p/6985757.html
Copyright © 2011-2022 走看看